テキストが正規表現と一致すると、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

答え2

次のようにスクリプトを変更できます。

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

答え3

猫の皮をむく方法は数え切れないほど多いですね…4番フィールド全体を交換したいと思いますか? 「条件付き」演算子を試してください。

awk -F '|' '{$4=($4=="XYZ")?"Y":"N"} 1' OFS="|" file5
ABC|YE0000123543|BLAH|Y|24.12.2025|J
ABC|YE0000123544|BLAH|N|24.12.2025|K

答え4

使用幸せ(以前のPerl_6)

~$ raku -ne 'my @a = .split("|"); @a.[3] eq "XYZ" ?? (@a.[3] = "Y") !! (@a.[3] = "N"); @a.join("|").put;'  file

または

~$ raku -ne 'my @a = .split("|"); @a.[3] = (@a.[3] eq "XYZ" ?? "Y" !! "N"); @a.join("|").put;'  file

必ずそうでしょうかawk?以下は、Rakuの三項演算子である「(条件)??True !!False」を使用したソリューションです。上記のsplit/メソッドの良いことは、joinコンマ接続を使用して単純なファイルを作成したい場合はcsvそれを設定できることです。それ以外の場合、Rakuの内容はawk公開された回答に似ており、Raku(およびPerl5)はインデックスが0であることです。

https://docs.raku.org/言語/operators#index-entry-operator_ternary
https://raku.org

関連情報