【问题标题】:Match two files with duplicate ids in awk or sed匹配 awk 或 sed 中具有重复 id 的两个文件
【发布时间】:2017-06-26 13:43:12
【问题描述】:

我有两个文件。文件 1 有 3000 行(1500 个 ID),文件 2 有 1400 行(700 个 ID)。文件 1 包含文件 2 中存在的所有 id。我必须匹配 File1 和 File 2 的 ID 列,同时保持 id 的顺序。如果文件 2 中的 id 存在于文件 1 中,则比较第 2 列并打印匹配或不匹配。抓住是否有重复的 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

【问题讨论】:

  • 为什么5 14 mismatch 显示在输出中? “5 14”确实出现在文件 1 中
  • 在文件 1 中第一次出现 5 的值为 14,而文件 2 中第一次出现 5 的值不是 14(它是 15),因此不匹配。因此,文件 1 中第一次出现的 id 与文件 2 中第一次出现的相同 id 匹配,文件 1 中第二次出现的 id 与文件 2 中第二次出现的 id 匹配
  • 发布的答案是否符合您的要求。你应该在这里给一些反馈。

标签: awk


【解决方案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/值保存到数组 a
  2. if(a[$1]==$2):如果file2中的id和value匹配,则认为记录匹配,否则不匹配。

【讨论】:

  • 我以 sh my 运行它。 awk file1 file 2 但它一直在运行并且没有输出
  • @akang,答案应该可以正常工作,我在这里尝试过没有问题。如果有问题,你可以去检查你的脚本。
  • 谢谢我让它运行起来了!但是 if 语句 if(id!=$1 && a[$1]==$2) 存在一些问题。即使有匹配,它也会在某些地方显示“不匹配”。
  • @akang 能否把案例展示出来,或者在问题中修改一下,以便我获取更多信息。
  • 基本上,如果有两个连续匹配,它会将一个显示为不匹配。
【解决方案2】:

最简单的方法是遍历文件 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2012-01-01
    • 2014-11-02
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多