特定参数的垂直输出到水平输出

问题描述 投票:0回答:4

我有一个来自卷曲的垂直输出,如下所示,我想使用 shell 脚本或批处理脚本来获得水平输出以放入 csv 格式。是否有可能或者您可以分享一个命令来获得这种输出?谢谢。

假设我将输出存储在output.txt中

"name" : "Bob",
"PhoneNumber" : "123-555"
"name" : "Mike",
"PhoneNumber" : "234-555"
"name" : "Amber",
"PhoneNumber" : "456-555"

水平输出:

姓名、电话号码
鲍勃,123-555
迈克,234-555
琥珀色,456-555

bash shell batch-file scripting output
4个回答
1
投票

如果批处理文件目录中的文件

output.txt
包含以下行,则可以使用下面的批处理文件命令行:

"name" : "Bob",
"PhoneNumber" : "123-555"
"name" : "Mike",
"PhoneNumber" : "234-555"
"name" : "Amber",
"PhoneNumber" : "456-555"

批处理文件是:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "%~dp0output.txt" echo File "%~dp0output.txt" not found.& exit /B 1
set "Name="
(   echo name,PhoneNumber
    for /F usebackq^ tokens^=1^,3^ delims^=^" %%I in ("%~dp0output.txt") do (
        if "%%I" == "name" (set "Name=%%J") else if "%%I" == "PhoneNumber" (
            set "PhoneNumber=%%J"
            setlocal EnableDelayedExpansion
            if "!Name:,=!" == "!Name!" (
                echo !Name!,!PhoneNumber:,=!
            ) else (
                echo "!Name!",!PhoneNumber:,=!
            )
            endlocal
        )
    )
)>"%~dp0Data.csv"
endlocal

此批处理文件在批处理文件目录中创建 CSV 文件

Data.csv
,其中包含以下行:

name,PhoneNumber
Bob,123-555
Mike,234-555
Amber,456-555

如果

name
包含逗号,则该名称将包含在 CSV 文件
"
中的
Data.csv
中。该代码确保电话号码在写入 CSV 文件之前不包含逗号。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • call /?
    ...解释
    %~dp0
    ...参数 0 的驱动器和路径,这是始终以反斜杠结尾的批处理文件路径。
  • echo /?
  • endlocal /?
  • exit /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

另请参阅:


0
投票

此解决方案是一种通用解决方案,可将输入文件转换为每个水平数据具有“任意数量”的垂直线;您只需要指定代码中的行数: @echo off setlocal EnableDelayedExpansion rem Set the number of lines that comprise each data group set "num=2" set "header=" set "head=" set "data=" set "n=0" (for /F "tokens=1,2 delims=:, " %%a in (output.txt) do ( set "head=!head!, %%~a" set "data=!data!, %%~b" set /A "n=(n+1)%%num" if !n! equ 0 ( if not defined header ( set "header=!head!" echo !header:~2! ) echo !data:~2! set "data=" set "head=" ) )) > output.csv



0
投票
awk

来做到这一点非常简单:

$ cat input
"name" : "Bob",
"PhoneNumber" : "123-555"
"name" : "Mike",
"PhoneNumber" : "234-555"
"name" : "Amber",
"PhoneNumber" : "456-555"
$ awk 'BEGIN{print "name, PhoneNumber"}
    /name/ {printf "%s, ", $3}
    /Phone/{print $3}'  FS='[": ,]*' input
name, PhoneNumber
Bob, 123-555
Mike, 234-555
Amber, 456-555

您可以使用以下方法使其(稍微)更加健壮:

$ awk 'BEGIN{print "name, PhoneNumber"} > $2 == "name" {printf "%s, ", $3} > $2 == "PhoneNumber"{print $3} > ' FS='[": ,]*' input name, PhoneNumber Bob, 123-555 Mike, 234-555 Amber, 456-555



0
投票

$ cat result.json { "result": [ { "name": "Bob", "PhoneNumber": "123-555" }, { "type": "user", "name": "Mike", "PhoneNumber": "234-555" }, { "type": "user", "name": "Amber", "PhoneNumber": "456-555" } ] }

使用jq

$ jq -r '["name","PhoneNumber"],(.result[]|[.name,.PhoneNumber])|join(", ")' result.json name, PhoneNumber Bob, 123-555 Mike, 234-555 Amber, 456-555

© www.soinside.com 2019 - 2024. All rights reserved.