次のレコードを含むファイルの場合:
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