命令行 - 使用awk,如何将每n行排列成列

分享于 

2分钟阅读

ubuntu

  繁體

问题:

我有一个以tab分隔的数据,如下所示:


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做到。


答案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



如果你想要以一个制表符分隔的列:


$ 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





COM  COL  COMM  Comma  命令行  column