如何将多个行块合并为一个块?

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() :)

以上是关于如何将多个行块合并为一个块?的主要内容,如果未能解决你的问题,请参考以下文章

视频合并软件把多个视频合并为一个视频使用方法

查找与块格式不匹配的行块

将多个库模块合并为一个

循环文件的 N 行并存储在多个列表中

列表及行块转变

Study 8 —— 行块元素及定位