使用AWK组合(合并)多行

时间:2015-04-24 17:32:53

标签: linux bash shell awk

嗨我有一个AWK命令,它将两个文件组合在一起。

awk -v OFS='\t' '
NR==1   { print $0, "Column4", "Column5"; next }
NR==FNR { a[$1]=$0; next}
$1 in a { print a[$1], $2, $3 }
' $1 $2 > $3

这只返回每个文件中的一个键。 例如,如下所示,

档案1

Key    Column1  Column2  Column3  
Test1    500     400     200               
Test1    499     400     200               
Test1    499     399     200               
Test1    498     100     100               
Test2    600     200     150               
Test2    600     199     150               
Test2    599     199     100               

文件2

Test1    Good     Good                    
Test2    Good     Good

然后结果将是

Key    Column1  Column2  Column3  Column4  Column5
Test1    500     400     200       Good      Good   
Test2    600     200     150       Good      Good

但我想让所有行合并如下。

Key    Column1  Column2  Column3  Column4  Column5
Test1    500     400     200       Good      Good            
Test1    499     400     200       Good      Good             
Test1    499     399     200       Good      Good             
Test1    498     100     100       Good      Good             
Test2    600     200     150       Good      Good             
Test2    600     199     150       Good      Good              
Test2    599     199     100       Good      Good           

任何人都只想使用AWK改变逻辑。 谢谢!C

1 个答案:

答案 0 :(得分:2)

我认为你正在寻找

join file1 file2

如果你坚持用awk做这件事,一个好办法就是以相反的方式处理文件,这样你就可以在处理主文件时准备好要添加的部分:

awk -v OFS='\t' '
  FNR == NR { a[$1] = $2 OFS $3; next }
  { $1 = $1 }
  FNR ==  1 { print $0, "Column4", "Column5" }
  FNR !=  1 { print $0, a[$1] }
  ' "$2" "$1" > "$3"
编辑:@EtanReisner建议添加{ $1 = $1 }。这样做的目的是强制awk从字段重建行,以便由空格混合分割的输入数据由OFS统一分隔(在本例中为制表符)。如果数据已经以制表符分隔,则没有必要(但不会受到伤害)。

相关问题