列形式の項目を含むファイルがある場合は、特定の列の特定の項目のみを置き換えて変更を同じファイルに保存できますか?
ファイルの例abc.txt
:
SR|FRUITS|COLOR|
1|Apple|Red|
2|Mango|Yellow|
3|Orange|Orange|
4|W.Melon|Green|
変更が必要ですオレンジ果物からorange_edit。ただし、色のオレンジ色は影響を受けません。
ベストアンサー1
awk
次の 2 つの手順で実行できます。
awk '{$2="VAL";print}' input_file > temp_file
mv temp_file input_file
これにより、入力ファイルが空白に分割され、2番目の列の値(他の列の場合は2以外の数字)が変わるため、「VAL」になります。OFS
出力フィールドの区切り文字に変更しないと、空白になります。他のものが必要な場合は、引用符の中に「BEGIN {OFS = "\ t"} ...」のようなものを追加して、出力フィールドの区切り文字を必要に応じて設定できます。
値を一定にしないようにするには、より多くの作業を行う必要がありますが、そうするように調整できます。
お客様のケースでこの機能を編集できるようにするには、次の手順を実行します。
awk -F\| 'BEGIN {OFS="|";} $2~/^Orange$/ {$2="Orange_edit";} {print}' abc.txt > temp_file
mv temp_file abc.txt
これは、まずawk
パスに従ってフィールドを分割するように指示します。次に、最初のコードブロック(実行を開始するキーワードと一致するBEGINと一致する部分)を作成し、または出力フィールド区切り文字を設定して出力区切り文字(デフォルトは空白)も使用するように出力を設定します。 Otheusが指摘したように、出力区切り記号を入力区切り記号と同じに設定できます。|
-F\|
|
awk
OFS
{OFS=FS}
それから私達はラインを見始めました。参照されている2番目のフィールドを比較し、次を使用して正規表現と$2
一致することを確認します。次に~
、~
一致させたい正規表現があります。^
ここでは、フィールドの先頭と一致することを意味し、文字列「Orange」があり、フィールド$
の終わりと一致します。これはハードコーディングされた文字列であるため、Otheusはここで文字列の同一性をテストしてからそれを行い、$2=="Orange"
今回は実際には何もしないため、正規表現処理をスキップできることを正確に観察しました。一致が成功すると、{}
実行されたコードブロックは新しい値を2番目のフィールドに保存します。
最後に、各行に対して最後のコードブロックを実行します{print}
が、上記の「オレンジ色」の一致が成功した場合は、2番目のフィールドの値を変更して古い値の代わりに新しい値として印刷します。
awk
これは通常画面に印刷されます(最新バージョンにはgawk
この部分を単純化するオプションがあります)、ファイルに保存してからファイルを元の名前に戻します。