Awk

如果 file1 中的值與 file2 中的值不匹配,則 awk 不列印

  • May 24, 2022

文件1:

G A 4
H B 3
I C 2
J D 1

文件2:

M H 6
N H 5
O K 4
P J 3
Q I 2
R I 1
S G 0
T L 1

期望:

M H 6
N H 5
P J 3
Q I 2
R I 1
S G 0

僅列印行 $ 2 from file2 matches $ 1 來自文件 1

我正在嘗試構造 if 語句,但它給了我下面的語法錯誤

awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {if{a[FNR]==b[FNR]}; {next}; { print }' file1 file2

syntax error at source line 1
context is
   NR==FNR{a[NR]=$1; b[NR]=$2; next} ; >>>  if <<< {a[FNR]==b[FNR]; next}; { print }

或者如果不使用 if 動詞則沒有輸出

awk 'NR==FNR{a[NR]=$1; b[NR]=$2; next} ; {a[FNR]==b[FNR]; next}; { print }' file1 file2

你的程式碼過於復雜了。試試這樣:

$ awk 'NR==FNR{a[$1]; next} $2 in a' file1 file2
M H 6
N H 5
P J 3
Q I 2
R I 1
S G 0

解釋:

  1. 過濾NR==FNR器僅過濾來自 file1 的行,因為對於該文件,總記錄數將與文件記錄數相同
  2. 對於第一個文件的行,我們將第一個欄位 ( $1) 添加為數組的鍵a,其中a[$1]. 然後我們跳過其餘的命令next
  3. 由於我們呼叫next了適用於第一個文件的所有行的第一個塊,因此第二個過濾器$2 in a僅適用於第二個文件的行。
  4. 過濾器$2 in a檢查第二個單詞$2是否是 array 中的鍵a。如果鍵存在,則執行預設操作,即列印目前行。

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