awk比较两个文件中的两列打印结果

时间:2019-09-25 14:20:52

标签: awk

在下面的awk中,我尝试匹配$2f1中的每一行f2,然后匹配$1和{中的f1 {1}},如果两个都匹配,则f2为“ MATCH”,否则$3为“ MISMATCH”。除非我删除了$3之一,否则下面的awk不会执行。谢谢:)。

f1

if

f2

1234 aaa
5678 xxxx
1244 yyyy
2255 zzzz

所需

5678 xxxx
224 zzzz
1244 yyyy
1234 aaa

awk

1234 aaa MATCH
5678 xxxx MATCH
1244 yyyy MATCH
2255 zzzz MISMATCH

2 个答案:

答案 0 :(得分:2)

AWK不能同时读取输入文件。
首先,您需要将f2读入数组,然后可以在处理$3时使用该数组确定f1中的内容。

awk 'NR==FNR{a[$1]=$2;next} {$3=(($1 in a&&a[$1]==$2)?"":"MIS")"MATCH"} 1' f2 f1

答案 1 :(得分:2)

请您尝试以下操作(这将打印出文件1中的值,而不是文件2中用于NON-MATCH关键字打印的值)。

awk '
FNR==NR{
  a[$1]=$0
  next
}
{
  print $0,$1 in a?"MATCH":"NON-MATCH"
}'  Input_file2  Input_file1


其他解决方案: :如果要为两个文件打印不匹配的行(因为上面的代码仅打印file1中的文件,而不打印file2中的文件)。 / p>

awk '
FNR==NR{
  a[$1]=$2
  next
}
{
  print $0,$1 in a?"MATCH":"NON-MATCH-FILE1"
  b[$1 in a?$1:""]
}
END{
  for(i in a){
     if(!(i in b)){
        print a[i]" NON-MATCH-FILE2"
     }
  }
}'  Input_file2  Input_file1