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に交換する必要がある他の行がある場合は、スイッチを使用できますxyz
。e
たとえば、
col1,col2,col3,col4
abc,def,xyz,xyz
xyz,abc,def,xyz
abc,def,xyz,abc
xyz
3列目の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
設定してください。最初の行(明らかに列ヘッダーが含まれている)で置換が発生しないことを確認してください。replacement
NR > 1