Awk

如果文本與正則表達式匹配,則 awk 替換。如果不是用別的東西代替。這可以用awk嗎?

  • July 10, 2022

對於包含以下記錄的文件:

ABC|YE0000123543|BLAH|XYZ|24.12.2025|J
ABC|YE0000123544|BLAH|MNO|24.12.2025|K

如果第四個欄位包含 XYZ,則將其替換為 Y。如果不是,則將其替換為 N。

聽起來很簡單,對吧?好吧,顯然匹配 awk 是非常困難的,如果不是不可能的話,或者我只是不明白。

替換匹配

$ echo "ABC|YE0000123543|BLAH|XYZ|24.12.2025|J"|awk -F '|' 'BEGIN { OFS=FS } {gsub(/XYZ/, "Y", $4);} {print $0}'
ABC|YE0000123543|BLAH|Y|24.12.2025|J

到目前為止,一切都很好!現在為不匹配列印 N:

只是否定正則表達式,對嗎?!/XYZ/

$ echo "ABC|YE0000123543|BLAH|MNO|24.12.2025|J"|awk -F '|' 'BEGIN { OFS=FS } {gsub(!/XYZ/, "N", $4);} {print $0}'
ABC|YE0000123543|BLAH|MNO|24.12.2025|J

不?它只是行不通。

在 SO 上查看其他答案讓我更加明智。似乎沒有什麼能夠可靠地替代 awk 中不匹配的正則表達式。

任何指針將不勝感激。

你貓改變腳本,如:

$ awk -F '|' 'BEGIN { OFS=FS } {if("XYZ"==$4) $4="Y" ;else $4="N"; print }' input_file >output_file

正如@Romeo 還建議的那樣,字元串相等比正則表達式更準確。

我會寫

awk 'BEGIN {FS=OFS="|"} {$4 = ($4 == "XYZ" ? "Y" : "N")} 1' file

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