Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何将多个线块合并到一个块中?_Unix - Fatal编程技术网

Unix 如何将多个线块合并到一个块中?

Unix 如何将多个线块合并到一个块中?,unix,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 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 '
    BEGIN{ORS=" "}
    NR%2{print; next}
    {arr[c++]=$0}
    END{print "\n"; for (a in arr) {print arr[a]}}
' file
输入文件: 输出:
最新的命令有一个前导空格,我不知道如何在没有
(g|en)sub()
:)

使用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

你已经试过什么了?你在哪里卡住了?我试过awk命令。例如:awk'ORS=NR%2?FS:RS'input.txt,但它将合并第1行和第2行、第3行和第4行,依此类推。我想要的是合并第1行和第3行,第2行和第4行…用这些重要信息编辑你的问题谢谢,Gilles!这很有效。在最初的问题中,我提到了两行输出。这只是为了让争论更容易。但是,如果我希望输出为3行或更多行,您有更好的解决方案吗?换句话说,我将此作为输入:line1 line2 line3 line4。。。我希望输出变成:line1 line4 line7。。。第2行第5行第8行。。。第3行第6行第9行…添加了uniq awk命令行。您可以使用NR(行号)进行数学运算
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 
$ 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
$ 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