我有一个来自卷曲的垂直输出,如下所示,我想使用 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
如果批处理文件目录中的文件
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 /?
另请参阅:
>
的说明。&
。此解决方案是一种通用解决方案,可将输入文件转换为每个水平数据具有“任意数量”的垂直线;您只需要指定代码中的行数:
@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
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
$ 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