Linux

比較兩個文本文件的第二列,如果匹配則列印兩個文件的第一列

  • January 17, 2021

我正在嘗試比較兩個文本文件的第二列,如果匹配則列印兩個文件的第一列。

我嘗試了以下awk程式碼,但沒有用

1) awk 'NR==FNR {a[$2]=$2; next} {print $1,a[$1]}' nid8.txt nid9.txt

2) awk 'NR==FNR {a[$2]=$2; next} {print $1, $1 in a}' nid8.txt nid9.txt

範例文件:

nid8.txt:

1000 500
1001 501
1002 502
1003 503
1004 504
1005 505

nid9.txt:

2000 504
2001 502
2002 508
2003 505
2004 500
2005 501

輸出:

1000 2004
1001 2005
1002 2001
1004 2000
1005 2003

你可以join在這裡使用:

join -j 2 -o 1.1 2.1 <(sort -nk2,2 nid8.txt) <(sort -nk2,2 nid9.txt)

使用兩個文件上的第二個欄位-j 2作為鍵。

-o輸入這些欄位:

第一個文件中的1.1

第一個欄位第二個文件中的第一個欄位2.1

join需要對輸入文件進行排序,因此我們在第二個欄位上對它們進行排序,該欄位將用作數字鍵sort -nk2,2 input


使用awkwhich 不需要對輸入進行排序,而是將第一個輸入文件載入到記憶體中:

awk '!second_file{ my_array[$2]=$1; next }
    ($2 in my_array) { print $1, my_array[$2] }' nid8.txt second_file=1 nid9.txt

my_array[$2]=$1我們只保存第一個輸入文件nid8.txt的第一列, 其中鍵是同一第一個文件的第二列,直到second_file變數值未設置為1,這導致!second_file表達式值評估為 false 並且不會在下一個執行該塊輸入。

($2 in my_array)條件下,我們檢查數組my_array中是否存在第二個欄位,如果存在,則列印第一個欄位(來自第二個文件)以及包含第一個文件中第一個欄位的$1 相同鍵的值my_array[$2]同樣的鑰匙

引用自:https://unix.stackexchange.com/questions/629213