我有一个像这样的制表符分隔的数据:
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
就可以完成。split
paste
假设一个名为的文件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