将行打包到列

时间:2014-10-08 15:40:53

标签: bash awk sed grep transpose

我知道如何将文件中的行转换为列,但我想将文件下半部分的行追加到上半部分的行。

像:

A1
A2
A3
B1
B2
B3

A1 | B1
A2 | B2
A3 | B3

该列表来自两个grep。我将第一个grep附加到第二个grep。这两个{{1}}具有相同的点击量。

我想在bash脚本中执行此操作。

4 个答案:

答案 0 :(得分:2)

如何将headtailpaste结合使用?

paste -d'|' <(head -3 file) <(tail -3 file)

它返回:

A1|B1
A2|B2
A3|B3

paste合并文件行。如果我们提供来自同一文件的不同行......那就是全部!

因为从一半的行中获取head而从其余行中获取tail,这是一种更通用的方式:

paste -d'|' <(head -n $(($(wc -l <file)/2)) file) 
            <(tail -n $(($(wc -l <file)/2)) file)

答案 1 :(得分:2)

您正在寻找pr工具:

printf "%s\n" {A,B}{1,2,3}   |   pr -2 -T -s" | "
A1 | B1
A2 | B2
A3 | B3

答案 2 :(得分:2)

$ awk '{a[NR]=$0} END{ m=NR/2; for (i=1;i<=m;i++) print a[i] " | " a[i+m]}' file
A1 | B1
A2 | B2
A3 | B3

答案 3 :(得分:1)

作为替代方案:

awk 'BEGIN{c=0}
     {a[c++] = $1}
     END { for (i = 0; i < c/2; i++) print a[i] " " a[i+c/2]}'

这假设你有一个偶数行作为输入。