在awk或sed中匹配具有重复ID的两个文件

时间:2017-06-23 08:39:05

标签: awk

我有两个文件。文件1有3000行(1500 Ids),文件2有1400行(700 Ids)。文件1包含文件2中存在的所有ID。我必须匹配File1&的ID列。文件2同时保持ID的顺序。如果文件1中的id存在于文件1中,则比较第2列并打印匹配或不匹配。 catch是有重复的id,我需要保留它们。寻找一个awk或sed解决方案。谢谢!

File1
ID  A
1   13
1   14
2   13
2   13
3   13
3   12
4   13
4   14
5   14
5   14

File 2
ID A
2 13
2 13    
3 13
3 3
5 14
5 15



Desired output
ID A
2 13 Match
2 13 Match    
3 13 Match
3 3 mismatch
5 14 Match
5 15 mismatch

2 个答案:

答案 0 :(得分:1)

您可以使用awk来实现这一目标,

awk '
  NR==FNR{ if(a[$1]=="") a[$1]=$2; next}
  /[0-9]/{
    if(a[$1]==$2){
      print $0,"match"
    } else {
      print $0,"mismatch"
    } id=$1
}' File1 File2

输出:

2 13 match
2 13 match
3 13 match
3 3 mismatch
5 14 match
5 15 mismatch

简要说明,

  1. NR==FNR{...}:在File1中,如果ID以前从未显示,请将id / value保存到数组a
  2. if(a[$1]==$2):如果ID和值在File2中匹配,则将记录视为匹配,否则不匹配。

答案 1 :(得分:0)

最简单的方法是遍历文件2中的行,并且每行在文件1中找到匹配的ID。由于您没有提供编程语言,这里是伪代码的解决方案:

for all rows in file2
  for all rows in file1
    if current_row_file1.id = current_row_file2.id
    then
      if current_row_file1.value_column2 = current_row_file2.value_column2
      then
        print current_row_file2.id + current_row_file2.value_column2 + "Match"
      else
        print current_row_file2.id + current_row_file2.value_column2 + "Mismatch

上面的代码需要花费一些时间来循环遍历文件1中文件1中每一行的所有记录。如果您对文件1中的ID进行了排序,则可以使用二进制搜索等算法来加速处理。在这里查看解释https://en.wikipedia.org/wiki/Binary_search_algorithm