パイプで区切られたファイル内の特定の行の特定の列の値を置き換えます - sedまたはawk?

パイプで区切られたファイル内の特定の行の特定の列の値を置き換えます - sedまたはawk?

特定の列値(位置によって識別される)をパイプで区切られたファイル内の特定の行の別の値で置き換える必要があります。

サンプルファイル:

a|abc|val|sum|temp
bs|run|win|can|done
jump|over|change|value

それでは、列3と2の値を「変更済み」に変更したいと思います。 (上記の入力例では、置き換えられる以前の値は「win」ですが、何でも構いませんが、それが何であるかは事前にわかりません。)

予想出力:

a|abc|val|sum|温度
ナンセンス|実行|変更|できる|完成
ジャンプ|クロス|変更|値

ベストアンサー1

GNU sedでは

sed -E '2s/^(([^|]*\|){2})[^|]*/\1changed/' input
  • 最初の「2」(2s)は行番号を表します。
  • 2番目の「2」({2})はスキップし、同じ列を維持する列の数を識別します。 17番目のフィールドを変更するには、を使用できます  {16}
  • このコマンドは、変更されたファイルを標準出力に書き込みます。まず、実行してターミナルに出力して、必要なものが正しいことを確認する必要があります。その後、必要に応じてコマンドを実行し、出力を2番目のファイルに出力してから、そのファイルを入力ファイルの上に移動またはコピーできます。
  • または、-isedにオプションを追加して入力ファイルを上書きすることもできます。

まったく:

awk -F'|' -vOFS='|' 'NR==2 {$3 = "changed"} {print}' input
  • このコマンドは、変更されたファイルを標準出力に書き込みます。まず、実行してターミナルに出力して、必要なものが正しいことを確認する必要があります。その後、必要に応じてコマンドを実行し、出力を2番目のファイルに出力してから、そのファイルを入力ファイルの上に移動またはコピーできます。

おすすめ記事