2015-03-31 82 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