如何使用 awk 将每 n 行排列成列

如何使用 awk 将每 n 行排列成列

我有一个像这样的制表符分隔的数据:

a 2
b 3
c 4
d 6
e 8
f 9
g 10
h 11
i 12
...

我想要的输出应该是这样的:

a 2 d 6 g 10 
b 3 e 8 h 11
c 4 f 9 i 12

我该如何做到这一点,例如使用 awk。

提前致谢。诚挚的,nsingh

答案1

我不确定,但只需使用和awk就可以完成。splitpaste

假设一个名为的文件data包含我们的行。首先将其分成 3 行块:

$ split -l 3 data output-

然后把这些块放在一起:

$ paste -d ' ' output-*

a 2 d 6 g 10
b 3 e 8 h 11
c 4 f 9 i 12

并记得删除output-文件。

答案2

使用 awk:

$ awk '{a[FNR%3] = a[FNR%3] == "" ? $0 : a[FNR%3] "\t" $0} END{for(i=1;i<=3;i++) print a[i%3]}' data.tsv
a   2   d   6   g   10
b   3   e   8   h   11
c   4   f   9   i   12

另一种可能性是rs实用程序 - 可能未默认安装,但可从 Ubuntu 上的包中获取rs

$ rs -e -C -t 0 3 < data.tsv
a   2   d   6   g   10  
b   3   e   8   h   11  
c   4   f   9   i   12  

在哪里

  • -e将每一行输入视为一个数组元素
  • -C输出列由单个制表符分隔
  • -t将输入列转置为行
  • 0 3使用尽可能多的行和 3 列

另一个选项是pr命令

例如,以 3 列打印,抑制页眉和页脚:

$ pr -T -3 < data.tsv
a   2       d   6       g   10
b   3       e   8       h   11
c   4       f   9       i   12

如果您希望列之间恰好由一个 TAB 字符分隔:

$ pr -s$'\t' -T -3 < data.tsv
a   2   d   6   g   10
b   3   e   8   h   11
c   4   f   9   i   12

相关内容