如何将多个行块合并为一个块?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将多个行块合并为一个块?相关的知识,希望对你有一定的参考价值。
我有一个像这样的输入文件:
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行......
答案
使用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
另一答案
不是最佳,但工作:):
代码:
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()
:)
以上是关于如何将多个行块合并为一个块?的主要内容,如果未能解决你的问题,请参考以下文章