テキストが正規表現と一致すると、awkはそれを置き換えます。そうでない場合は、別のものと交換してください。 awkを使ってこれを達成できますか?

テキストが正規表現と一致すると、awkはそれを置き換えます。そうでない場合は、別のものと交換してください。 awkを使ってこれを達成できますか?

次のレコードを含むファイルの場合:

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

4番目のフィールドに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

いいえ?それだけでは動作しません。

見ているその他の回答だから私は手がかりがないようにします。 awkで比較できない正規表現に代わる信頼できる代替品はないようです。

どんなアドバイスも本当にありがとうございます。

ベストアンサー1

@Romeoも提案したように、文字列の同一性は正規表現よりも正確である可能性があります。

私は書くことができます

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

おすすめ記事