Awk
使用包含 {BEGIN FS = ‘|’} 的命令的 2 個單獨文件中的 awk 匹配欄位返回空行的輸出
兩個文件: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 。
- 您可能有 DOS 行結尾,請參閱why-does-my-tool-output-overwrite-itself-and-how-do-i-fix-it,所以如果存在,請刪除它(我正在刪除它和任何其他尾隨空格在
sub()
下面我的腳本中)。- 如果你得到一個空行輸出,那麼你的每個輸入文件中都有空行,但我敢打賭你並沒有真正得到一個空行輸出,而是你得到了你應該得到的 1 行輸出
105.15
但CR
最後是覆蓋回到行首 - 管道輸出| cat -v
以查看是否屬實。- 您的輸入在某些地方的 s 前後有空格,
|
因此您應該設置FS
為匹配 -FS=" *[|] *"
- 你不需要寫
{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
塊是不必要的。