awkを使用してn番目の列を検索して置換する

awkを使用してn番目の列を検索して置換する

col3でのみ「xyz」を検索して置き換える方法は?

col1,col2,col3,col4  
abc,def,xyz,xyz  
xyz,abc,def,xyz

答え1

この試み:

awk -F , '{ if ($3 == "xyz") $3="abc";}1' OFS=, test.csv

答え2

何に変更するか言及していないので、単にプレースghiホルダーとして使用しました。

実際のテキストの場合、最も簡単な方法はを使用することですsed。これにより、awk修正のみが標準出力に送信され、以下のsedようにファイル自体を変更できます。

sed '2s|xyz|ghi|1' file

説明する:

2s replaces instances on the second line
xyz is what you want to replace
ghi is what it's being replaced with
1 replaces the first instance of it on the specified line

出力:

col1,col2,col3,col4
abc,def,ghi,xyz
xyz,abc,def,xyz

必要に応じて動作することを確認したら、スイッチを使用して-iファイルを標準出力に送信するのではなく、ファイル自体を変更してください。

sed -i '2s|xyz|ghi|1' file

他の行と列を置き換えるには、場所とインスタンスを変更して2s指定する必要があります。1もちろん、ghi必要な代替品と交換することもできます。

列3に交換する必要がある他の行がある場合は、スイッチを使用できますxyzeたとえば、

col1,col2,col3,col4
abc,def,xyz,xyz
xyz,abc,def,xyz
abc,def,xyz,abc

xyz3列目の4行目にも表示されます。

sed -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file

sed -i -e '2s|xyz|ghi|1' -e '4s|xyz|ghi|1' file

-eこれは4行目の最初のインスタンスを置き換え、指定された各代替ストリームに使用されます。この-iスイッチは、ファイルを標準入力に送信するのではなく、ファイルを変更します。

答え3

awk -F ',' -v needle='xyz' -v replacement='foobar' 'BEGIN{ OFS = FS; } (NR > 1 && $3 == needle) { $3 = replacement; } 1' input.txt

必要に応じてneedle設定してください。最初の行(明らかに列ヘッダーが含まれている)で置換が発生しないことを確認してください。replacementNR > 1

関連情報