特定のフィールドの特定のテキストのみを置き換えるには、nawkを使用してください。

特定のフィールドの特定のテキストのみを置き換えるには、nawkを使用してください。

私の入力データファイルabc.txtには次のものがあります。

"20131008","0004","0568","98"

このコマンドを実行してテキストを置き換えます。

nawk -F, -vOFS=',' '{gsub("0568","0808",$3); print }' abc.txt

出力では、区切り文字 "," はスペースで置き換えられます。出力は次のとおりです。

 "20131008" "0004" "0568" "98".

この問題を解決するのに役立つ人はいますか?交換してみ-vOFSましたが役に立ちませんでした。

答え1

この回答は、awkコマンドライン出力とファイル変更の両方の例と例を示しています。sed

の場合、コマンドライン出力(または変数)で変更された文字列を使用して受信しますawk$ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt、元のファイルは変更されません。

$ cat input.txt 
"20131008","0004","0568","98"
$ awk -F"," '{gsub("0568", "0808", $3)}1' input.txt
"20131008" "0004" "0808" "98"

の場合、フラグは内部変更(つまり元のファイルの変更)を表す単純なsed形式を使用します。sed -i 's/string to replace/new string/g' input.txt-i

$ cat input.txt 
"20131008","0004","0568","98"
$ sed -i 's/0568/0808/g' input.txt
$ cat input.txt 
"20131008","0004","0808","98"

リクエストされたものではありませんがnawk(私はインストールしていません)、助けてくれたことを願っています。

答え2

私は1つもいませんが、nawkこれが私に役立ちました(スイッチgawkを使用)。--posix

awk 'BEGIN{FS=OFS=","}{sub(/0568/,"0808",$3)}1' file

Fedokhiによるコメント-v OFS=','代わりに使用する必要がありますが、-vOFS=','入力と出力の区切り文字が同じ場合、ブロックの割り当てがBEGIN長すぎません。また一度だけ交換したいようですのでgsubに変更させていただきます。sub両方の関数の最初のパラメータは正規表現なので、文字列を渡さないでください。

出力:

"20131008","0004","0808","98"

答え3

私はこれを試しました:

nawk 'BEGIN { FS=OFS="," } { sub("0568","0808",$3) }1' abc.txt

良い結果。

関連情報