Awk

使用包含 {BEGIN FS = ‘|’} 的命令的 2 個單獨文件中的 awk 匹配欄位返回空行的輸出

  • March 22, 2022

兩個文件:data1

   Name       |formula           |no. |dose|days|cost  |msg|em|notes
   Fname-Lname|BXXXT+GG          |8262|4   |14  |57.78 |   |  |sq
   Fname-Lname|SJXXT+GG          |8263|4¾  |14  |105.15|   |  |IB
   Fname-Lname|FJDHT+BH,LG,CQC,ZX|8264|5¾  |14  |46.20 |   |  |IB

數據2

10/12/2020|more-data-3456|105.15
10/12/2020|more-data-3456|95.10
11/12/2020|more.data-3456|30.30
14/12/2020|more-data-3456|45.55

我正在使用程式碼片段

awk 'BEGIN {FS = "|" } NR==FNR{a[$6];next} $3 in a {print $0}' data1 data2

匹配其中的值 $ 6 of file data1 also occurs in $ 3文件數據2。如果有匹配項,則列印出包含文件 data2 中匹配項的整個記錄 ($0)。我期待:

10/12/2020|more-data-3456|105.15

但我只得到一個空行的輸出。"|"我使用替換命令刪除了文件分隔符" ",命令程式碼完全按預期工作,但我真的希望盡可能保留欄位分隔符|。我想了解為什麼添加 BEGIN 塊會導致這種情況。它是否導致 awk 載入一個空數組而不是從 S6 獲取數據?我的 awk 水平略高於初學者。編輯:我還使用了具有相同結果的 -F 參數,即空行的輸出。我正在使用 gawk 。

  1. 您可能有 DOS 行結尾,請參閱why-does-my-tool-output-overwrite-itself-and-how-do-i-fix-it,所以如果存在,請刪除它(我正在刪除它和任何其他尾隨空格在sub()下面我的腳本中)。
  2. 如果你得到一個空行輸出,那麼你的每個輸入文件中都有空行,但我敢打賭你並沒有真正得到一個空行輸出,而是你得到了你應該得到的 1 行輸出105.15CR最後是覆蓋回到行首 - 管道輸出| cat -v以查看是否屬實。
  3. 您的輸入在某些地方的 s 前後有空格,|因此您應該設置FS為匹配 -FS=" *[|] *"
  4. 你不需要寫{print $0},因為這是預設行為

嘗試這個:

awk 'BEGIN{FS=" *[|] *"} {sub(/[[:space:]]+$/,"")} NR==FNR{a[$6];next} $3 in a' data1 data2

您的程式碼適用於我,適用於 GNU awk 5.1.0 和 macOS awk 20200816。

您使用的是哪個版本的 awk?

請注意,您還可以使用-F命令行參數設置欄位分隔符;如果你這樣做,那麼該BEGIN塊是不必要的。

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