2015-03-31 110 views
0

我试图通过合并来自一个文件的所有数据以及来自第二文件的部分数据与来自第一文件的部分数据的合并来创建文件(根据每个文件的列1中的匹配分配)。 file1的第1列可能有多个条目。文件2的第1列可能有零个,一个或多个匹配file1的条目。无论文件2中是否存在匹配,file1中的所有记录都需要存在于输出文件中。无论何处存在匹配项,都需要创建一个条目,其中包括file2中的第1列与file1中的第2列合并。awk - 合并数据并根据匹配值赋值

file1的:

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

file2的:

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 

期望输出(I不关心在这一点上排序 - 它可在以后处理):

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列2的较长字符串),但是在Windows的记事本中打开时,每个记录的行和每隔一行的两个列。感谢您的任何帮助,您可以提供!!

+0

在你的开头段落中,我认为它应该是“...包括来自file2的第2列与file1合并的第2列**”。 – 2015-03-31 19:55:00

+0

是的,我的错误,很好。 – user4735294 2015-03-31 20:27:09

回答

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并打印第一列中第一个文件的所有匹配项。

+0

你好Tom,感谢您的答复,但输出缺少以下行(这是有file1中的多个条目为: 1000000004 AE160D7D81E725556FAFD105F302D51D 1000000004 18FEA2F7BEF0FB4A67D2D2DDA3560B80)在所需的输出 丢失记录: 1000000879 AE160D7D81E725556FAFD105F302D51D 1000018525 AE160D7D81E725556FAFD105F302D51D 1000000595 AE160D7D81E725556FAFD105F302D51D 1000001943 AE160D7D81E725556FAFD105F302D51D 1000001772 AE160D7D81E725556FAFD105F302D51D – user4735294 2015-03-31 20:13:58

+0

@ user4735294我已经更新了我的答案来处理重复的第一个文件的第一列。我相信它现在会产生所需的输出。 – 2015-03-31 20:43:24

+0

你好,我想知道是否有缓冲区限制或其他awk的限制;我正在对较大的文件运行此操作,并且似乎很多条目都不会将其输入到输出文件中。 file1包含约730行,file2包含约1700行。我的输出文件应该有2000行左右,我只有1000左右。 – user4735294 2015-05-11 20:39:22