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

时间:2018-02-28 22:17:08

标签: unix

我有一个像这样的输入文件:

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行......

2 个答案:

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