我有一个像这样的输入文件:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
...
我希望它像:
1 2 3 7 8 9 13 14 15...
4 5 6 10 11 12 16 17 18...
如何使用Unix / Linux命令执行此操作?本质上,我想将几个块(例如在上面的例子中,每个块有2行)组合成一个块。
我试过awk命令。例如:
awk 'ORS=NR%2?FS:RS' input.txt
但它将合并第1行和第2行,第3行和第4行,依此类推。我想要的是合并第1行和第3行......,第2和第4行......
答案 0 :(得分:0)
不是最佳,但有效:):
awk 'BEGIN{ORS=" "} NR%2' file
echo
awk 'BEGIN{ORS=" "} NR%2==0' file
echo
或在一个awk中:
awk '
BEGIN{ORS=" "}
NR%2{print; next}
{arr[c++]=$0}
END{print "\n"; for (a in arr) {print arr[a]}}
' file
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
22 23 24
1 2 3 7 8 9 13 14 15 19 20 21
4 5 6 10 11 12 16 17 18 22 23 24
最新命令有一个领先的空间,我不知道如何在没有(g|en)sub()
的情况下删除:)
答案 1 :(得分:0)
使用 awk
$ awk -v l=2 'FNR<=l{a[FNR]=$0; next} {a[(FNR-1)%l+1]=a[(FNR-1)%l+1] FS $0} END{for(i=1; i<=l; i++) print a[i]}' file
1 2 3 7 8 9 13 14 15
4 5 6 10 11 12 16 17 18
您可以根据输出中所需的行数将l
调整为3
或其他任何内容
$ awk -v l=3 'FNR<=l{a[FNR]=$0; next} {a[(FNR-1)%l+1]=a[(FNR-1)%l+1] FS $0} END{for(i=1; i<=l; i++) print a[i]}' f5
1 2 3 10 11 12
4 5 6 13 14 15
7 8 9 16 17 18