2017-06-23 18 views
0

我有兩個文件。文件1有3000行(1500 Ids),文件2有1400行(700 Ids)。文件1包含文件2中存在的所有ID。我必須與File1 &文件2的ID列匹配,同時保持ID的順序。如果來自文件2的ID存在於文件1中,則比較列2和打印匹配或不匹配。 catch是否有重複的id,我需要將它們全部保留。尋找awk或sed解決方案。謝謝!在awk或sed中匹配兩個帶有重複ID的文件

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

爲什麼輸出中顯示「5 14 mismatch」?文件1中出現'5 14' – CWLiu

+0

在文件1中,5的第一次出現的值是14,而文件2中的第一次出現5的值不是14(它是15),因此不匹配。因此,文件1中id的首次出現應與文件2中第一次出現相同id匹配,並且文件1中id的第二次出現與文件2中id的第二次出現匹配 – akang

+0

發佈的答案是否符合您的要求。你應該在這裏給一些反饋。 – CWLiu

回答

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{...}:在文件1,保存ID /值到數組a如果ID從未顯示過虛擬地
  2. if(a[$1]==$2):如果id和值匹配在File2中,查看記錄匹配,否則不匹配。
+0

我把它當成我的。 awk file1文件2,但它一直運行,並沒有輸出 – akang

+0

@康,答案應該很好,我在這裏沒有問題的嘗試。如果你遇到問題,你可以去檢查你的腳本。 – CWLiu

+0

謝謝,我得到它runnng!但if語句if(id!= $ 1 && a [$ 1] == $ 2)存在一些問題。即使在有匹配的地方,它也會顯示「不匹配」。 – akang

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中爲文件2中的每一行循環遍歷文件1中的所有記錄需要一些時間。如果文件1中的ID是有序的,則可以使用二進制搜索等算法來加速處理。看看這裏的解釋https://en.wikipedia.org/wiki/Binary_search_algorithm

相關問題