以 CSV 格式将每第 n 行命令输出分组

Ini*_*ian 2 csv bash awk sed

我正在寻找一种解析多行命令输出的方法;nth以 CSV 格式将行和格式的每个倍数分组。

$ cat file
ABC
123
62p4-123
DEF
456
62p4-456
Run Code Online (Sandbox Code Playgroud)

我需要将 o/p 分组在每一3rd行,并以 3 的倍数分组,即第 3、6 和 9 后分别以逗号分隔格式的第 1、4、7 和 2、5 和 8

ABC,DEF
123,456
62p4-123,62p4-456
Run Code Online (Sandbox Code Playgroud)

这只是一个示例格式,我的实际用例是一个jsono/p,我想使用工具/实用程序bash对其进行格式化,并且我不需要在jq用于解析数据的格式化选项中。

我找到了几种awk类似的方法,awk 'NR % 3 == 0'但我无法对其他行重复此操作。

编辑:-正在更新我从jq这里返回的实际 JSON o/p以获得最有效的解决方案

4496
http://xxx/yyy
/home/build/branches/mmm/file1
4497
http://xxx/yyy/zzz
/home/build/branches/mmm/file1
4498
http://xxx/yyy/zzz
/home/build/branches/mmm/otherfile.c
Run Code Online (Sandbox Code Playgroud)

预期 o/p

4496,4497,4498
http://xxx/yyy,http://xxx/yyy/zzz,http://xxx/yyy/zzz
/home/build/branches/mmm/file1,/home/build/branches/mmm/file1,home/build/branches/mmm/otherfile.c
Run Code Online (Sandbox Code Playgroud)

kar*_*kfa 5

这里有一个更简单的方法

$ pr -2ts, file

ABC,DEF
123,456
62p4-123,62p4-456
Run Code Online (Sandbox Code Playgroud)

对于另一个输入,将列数更改为 3。

$ pr -3ts, file

4496,4497,4498
http://xxx/yyy,http://xxx/yyy/zzz,http://xxx/yyy/zzz
/home/build/branches/mmm/file1,/home/build/branches/mmm/file1,/home/build/branches/mmm/otherfile.c
Run Code Online (Sandbox Code Playgroud)

如果您只知道行数,而不知道最终的列数,则可以执行此操作

$ pr -$(awk 'END{print NR/3}' file) -ts, file
Run Code Online (Sandbox Code Playgroud)

  • @karakfa 您添加的 pr+awk 解决方案将失败并显示神秘的错误消息,因为输入文件为空,或者输入文件的行数不能被所需的输出列数整除。你需要类似`pr -$(awk 'END{print (NR ? int((NR+2)/3) : 1)}' file) -ts, file` 来解决这两个问题,但我不是当然,即使这样做。 (2认同)