如何连接在两行上指定的标识符?

input由两行指定的标识符1-2

L1_I L1_I C-14 <---| unique idenfier WWPTH WWPT WWPTH <---| on two rows 1 2 3 

目标:如何连接行?

 L1_IWWPTH L1_IWWPT C-14WWPTH <--- unique identifier 1 2 3 

我会接受最简单最优雅的解决scheme。

假设输入是在一个名为file

 $ awk 'NR==1{for (i=1;i<=NF;i++) a[i]=$i;next} NR==2{for (i=1;i<=NF;i++) printf "%-20s",a[i] $i;print"";next} 1' file L1_IWWPTH L1_IWWPT C-14WWPTH 1 2 3 

怎么运行的

  • NR==1{for (i=1;i<=NF;i++) a[i]=$i;next}

    对于第一行,将所有列标题保存在数组a 。 然后,跳过其余的命令并跳到下一行。

  • NR==2{for (i=1;i<=NF;i++) printf "%-20s",a[i] $i;print"";next}

    对于第二行,打印所有列标题,将第一行和第二行的标题合并在一起。 然后,跳过其余的命令并跳到下一行。

  • 1

    1是awk用来打印这条线的神秘速记。 这是为秒后的所有行完成的。

制表符分隔的列可能缺少列

如果列以制表符分隔:

 awk -F'\t' 'NR==1{for (i=1;i<=NF;i++) a[i]=$i;next} NR==2{for (i=1;i<=NF;i++) printf "%s\t",a[i] $i;print"";next} 1' file 

如果你打算使用python,你可以用下面的方法使用zip:

 input = [['L1_I', 'L1_I', 'C-14'], ['WWPTH','WWPT','WWPTH'],[1,2,3]] output = [[i+j for i,j in zip(input[0],input[1])]] + input[2:] print output 

输出:

 [['L1_IWWPTH', 'L1_IWWPT', 'C-14WWPTH'], [1, 2, 3]] 
 #!/usr/bin/awk -f NR == 1 { split($0, a) next } NR == 2 { for (b in a) printf "%-20s", a[b] $b print "" next } 1