2016-10-10 66 views
1

我想比較兩個文件的前兩列,如果匹配需要打印yes else no。比較不同文件的兩列並添加新列如果匹配

input.txt中

123,apple,type1 
123,apple,type2 
456,orange,type1 
6567,kiwi,type2 
333,banana,type1 
123,apple,type2 

qualified.txt

123,apple,type4 
6567,kiwi,type2 

output.txt的

123,apple,type1,yes 
123,apple,type2,yes 
456,orange,type1,no 
6567,kiwi,type2,yes 
333,banana,type1,no 
123,apple,type2,yes 

我所用的以下命令分割數據,然後我會添加根據結果​​再增加一列。

現在input.txt有重複(第一列),所以下面的方法不起作用,文件大小也很大。

我們可以在awk單線程中得到output.txt嗎?

comm -2 -3 input.txt qualified.txt 
+0

爲什麼第2列?它看起來像前兩個總是配對,所以爲什麼不比較一個呢?如果它們不總是配對(例如,你可以有'123,apple'和'9631,apple'),那麼在你的例子中包含它。 –

回答

1
$ awk -F, 'NR==FNR {a[$1 FS $2];next} {print $0 FS (($1 FS $2) in a?"yes":"no")}' qual input 
123,apple,type1,yes 
123,apple,type2,yes 
456,orange,type1,no 
6567,kiwi,type2,yes 
333,banana,type1,no 
123,apple,type2,yes 

解釋:

NR==FNR {     # for the first file 
    a[$1 FS $2];next   # aknowledge the existance of qualified 1st and 2nd field pairs 
} 
{ 
    print $0 FS ($1 FS $2 in a?"yes":"no")  # output input row and "yes" or "no" 
}             # depending on whether key found in array a 

無需重新定義OFS$0不被修改,並沒有得到重建。

1

您可以如下使用awk邏輯這一點。不知道你爲什麼提到單線awk命令。

awk -v FS="," -v OFS="," 'FNR==NR{map[$1]=$2;next} {if($1 in map == 0) {$0=$0FS"no"} else {$0=$0FS"yes"}}1' qualified.txt input.txt 

123,apple,type1,yes 
123,apple,type2,yes 
456,orange,type1,no 
6567,kiwi,type2,yes 
333,banana,type1,no 
123,apple,type2,yes 

的邏輯是

  • 命令FNR==NR解析所述第一文件qualified.txt和與第一列是索引存儲在第一文件中1柱和2中的條目。
  • 然後對於第二個文件{if($1 in map == 0) {$0=$0FS"no"} else {$0=$0FS"yes"}}1中的每一行,列1中的條目與該數組不匹配,在其他情況下追加no字符串和yes
  • -v FS="," -v OFS=","是設置輸入和輸出的字段分隔
+1

在'-v'之後不放一個空格會使腳本完全不必要地成爲特定於gawk的腳本。數組名稱''''通常用於表示一個集合,而不是映射。如果你正在創建一個地圖,使用'map'或者類似的名字來清晰,但是我沒有看到你實際上將它引用爲一張地圖,只是將它填充爲idk ... –

+1

@EdMorton:感謝您的更正,希望我知道它之前:) – Inian

1

它看起來像所有你需要的是:

awk 'BEGIN{FS=OFS=","} NR==FNR{a[$1];next} {print $0, ($1 in a ? "yes" : "no")}' qualified.txt output.txt 
相關問題