【问题标题】:awk - merge data and assign values based on matchesawk - 合并数据并根据匹配分配值
【发布时间】:2015-03-31 19:26:55
【问题描述】:

我正在尝试通过将一个文件中的所有数据和第二个文件中的部分数据与第一个文件中的部分数据合并来创建一个文件(根据每个文件第 1 列中的匹配项进行分配) )。 file1 的第 1 列可能有多个条目。 file2 的第 1 列可能有零个、一个或多个与 file1 匹配的条目。无论 file2 中是否存在匹配项,file1 中的所有记录都需要存在于输出文件中。只要存在匹配项,就需要创建一个条目,其中包含来自 file2 的第 1 列与来自 file1 的第 2 列合并。

文件1:

1000000001 3B413B9E9BD9E72DF10CE754F386B073
1000000001 70366A2BA2D0476FB587FBFE0904E891
1000000003 D9F5F4F8EC337F76CCE3C34AF33F5F4B
1000000004 AE160D7D81E725556FAFD105F302D51D
1000000004 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000007 3B413B9E9BD9E72DF10CE754F386B073
1000000008 4544AE8958411CC2CF541C0054EAFCB0
1000000013 566D29AC189E1C24D0E5DE46DCA14752

文件2:

1000000002 1000010051
1000000002 1000000006
1000000002 1000010073
1000000004 1000000879
1000000004 1000018525
1000000004 1000000595
1000000004 1000001943
1000000004 1000001772
1000000004 1000001770
1000000010 1000000167
1000000010 1000001495
1000000013 1000016156
1000000013 1000000484
1000000013 1000000454

期望的输出(此时我不关心排序 - 可以稍后处理):

1000000001 3B413B9E9BD9E72DF10CE754F386B073
1000000001 70366A2BA2D0476FB587FBFE0904E891
1000000003 D9F5F4F8EC337F76CCE3C34AF33F5F4B
1000000004 AE160D7D81E725556FAFD105F302D51D
1000000879 AE160D7D81E725556FAFD105F302D51D
1000018525 AE160D7D81E725556FAFD105F302D51D
1000000595 AE160D7D81E725556FAFD105F302D51D
1000001943 AE160D7D81E725556FAFD105F302D51D
1000001772 AE160D7D81E725556FAFD105F302D51D
1000000004 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000879 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000018525 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000595 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001943 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001772 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001770 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000007 3B413B9E9BD9E72DF10CE754F386B073
1000000008 4544AE8958411CC2CF541C0054EAFCB0
1000000013 566D29AC189E1C24D0E5DE46DCA14752
1000016156 566D29AC189E1C24D0E5DE46DCA14752
1000000484 566D29AC189E1C24D0E5DE46DCA14752
1000000454 566D29AC189E1C24D0E5DE46DCA14752

我以为我有以下 awk 语句:

awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $2,a[$1]}' file1.txt file2.txt > output.txt

似乎删除了多个条目,并且在 unix 上查看时,数据还包含一些非打印记录(仅看到 file1 Column 2 的较长字符串),但是在 Windows 上的记事本中打开时,有两行每条记录和每隔一行的两列。感谢您提供的任何帮助!

【问题讨论】:

  • 在您的开篇段落中,我认为应该是“...包括来自 file2 的列 2 与来自 file1 的列 2 合并。”
  • 是的,我的错,很好。

标签: bash awk merge match


【解决方案1】:

我认为这会产生你想要的输出:

$ awk 'NR==FNR{a[$2]=$1;print;next}{for(i in a)if(a[i]==$1)print $2,i}' file1 file2
1000000001 3B413B9E9BD9E72DF10CE754F386B073
1000000001 70366A2BA2D0476FB587FBFE0904E891
1000000003 D9F5F4F8EC337F76CCE3C34AF33F5F4B
1000000004 AE160D7D81E725556FAFD105F302D51D
1000000004 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000007 3B413B9E9BD9E72DF10CE754F386B073
1000000008 4544AE8958411CC2CF541C0054EAFCB0
1000000013 566D29AC189E1C24D0E5DE46DCA14752
1000000879 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000879 AE160D7D81E725556FAFD105F302D51D
1000018525 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000018525 AE160D7D81E725556FAFD105F302D51D
1000000595 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000000595 AE160D7D81E725556FAFD105F302D51D
1000001943 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001943 AE160D7D81E725556FAFD105F302D51D
1000001772 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001772 AE160D7D81E725556FAFD105F302D51D
1000001770 18FEA2F7BEF0FB4A67D2D2DDA3560B80
1000001770 AE160D7D81E725556FAFD105F302D51D
1000016156 566D29AC189E1C24D0E5DE46DCA14752
1000000484 566D29AC189E1C24D0E5DE46DCA14752
1000000454 566D29AC189E1C24D0E5DE46DCA14752

打印第一个文件中的每一行并存储键值对。对于第二个文件中的每一行,循环遍历数组 a 并打印第一个文件中第一列的所有匹配项。

【讨论】:

  • Hi Tom, thanks for the response, but the output is missing the following lines (this is where there were multiple entries in file1 for: 1000000004 AE160D7D81E725556FAFD105F302D51D 1000000004 18FEA2F7BEF0FB4A67D2D2DDA3560B80) missing records in desired output: 1000000879 AE160D7D81E725556FAFD105F302D51D 1000018525 AE160D7D81E725556FAFD105F302D51D 1000000595 AE160D7D81E725556FAFD105F302D51D 1000001943 AE160D7D81E725556FAFD105F302D51D 1000001772 AE160D7D81E725556FAFD105F302D51D
  • @user4735294 我已经更新了我的答案以处理第一个文件第一列中的重复项。我相信它现在会产生所需的输出。
  • 你好,我想知道是否有缓冲区限制或其他 awk 限制;我正在对较大的文件运行它,似乎许多条目没有进入输出文件。 file1 包含大约 730 行,file2 包含大约 1700 行。我的输出文件应该有大约 2000 行,我只得到大约 1000 行。
  • @user4735294 这些大小听起来不够大,不会遇到任何内存限制问题,我想问题可能出在数据格式上。
  • 感谢您对内存的回复,我会继续查看数据。
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多