使用awk比较多个文件和列

时间:2013-10-10 20:06:34

标签: bash awk

我有两个文件,我想将file1中的第2列和第3列与来自file3的第2列和第3列相匹配。如果找到模式,我想从file2输出整行,最后从file1的第1列输出:

我有以下两种文件类型: (file2有很多列(tab已分隔),但第2列和第3列可以匹配file1中的2和3。)

file1

name1 1 12343442 
name2 2 32434242
name3 3 982793749

file2

a 1 12343442 text1  text2  text3 value0 value2 
a 1 12343442 text1  text2  text3 value2 value3 
a 1 12348888 text1  text2  text3 value0 value2   
b 3 982793749 text1  text4  text3 value1 value11
b 2 982793749 text1  text4  text3 value1 value11

期望的输出

a 1 12343442 text1  text2  text3 value0 value2 name1
a 1 12343442 text1  text2  text3 value2 value3 name1
b 3 982793749 text1  text4  text3 value1 value11 name3

我尝试使用awk执行此操作。类似的东西:

awk 'BEGIN { FS = "\t" } NR==FNR { a[$1]=$2 FS $3; next} ('$2 FS $3' in a) {print $0, a[$1]}' file1 file2

但它不起作用。即使我只是尝试匹配第三列,它也不起作用。 这些文件非常大> 500mb 所以我想只阅读一次。 有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

这个单行应该有效:

awk -F'\t' -v OFS='\t' 'NR==FNR{a[$2FS$3]=$1;next}$2FS$3 in a{print $0,a[$2FS$3]}' file1 file2

代码

  • 您有a[$1]=$2 FS $3;next,您对keyvalue感到困惑。在这里,您希望$2FS$3为关键字,$1为值。
  • ('$2 FS $3' in a)也不正确,请删除单引号