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

yzxexxkh  于 8个月前  发布在  Shell
关注(0)|答案(4)|浏览(66)

我有一个垂直输出从一个 curl 像下面,我想使用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

pkln4tw6

pkln4tw61#

如果批处理文件目录中的文件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文件之前不包含逗号。
要了解所使用的命令及其工作方式,请打开command prompt窗口,在那里执行以下命令,并仔细阅读显示的每个命令的帮助页面。

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

另请参阅:

yqlxgs2m

yqlxgs2m2#

此解决方案是一个通用的,转换一个输入文件与 * 任何数量 * 的垂直线为每个水平数据;你只需要指定代码中的行数:

@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
rur96b6h

rur96b6h3#

这有点脆弱,但用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
deyfvvtc

deyfvvtc4#

您的result_file

$ 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

相关问题