3

このように整理されたデータを含むファイルを処理する必要があります

AAAAA:BB:CCC:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP
etc

列の長さは異なる場合がありますが、行の列数は常に同じです。

特定の行の特定の列を切り取って、必要な値に変更できるようにしたい。

たとえば、コマンドを適用してファイルを次のように変更します

AAAAA:BB:XXXX:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP

sedで特定の行を選択してからフィールドを切り取る方法は知っていますが、フィールドを自分の持っている値に置き換える方法がわかりません。

ありがとう

4

2 に答える 2

6

これを行う方法は次のawkとおりです。

あなたの例で、1行目の3番目のフィールドを置き換えたい場合:

awk 'BEGIN{FS=OFS=":"} {if (NR==1) {$3 = "XXXX"}; print}' input_file

入力:

AAAAA:BB:CCC:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP

出力:

AAAAA:BB:XXXX:EEEE:DDDD
FF:III:JJJ:KK:LLL
MMMM:NN:OOO:PP

説明:

  • awk:awkコマンドを呼び出す
  • '...':一重引用符で囲まれたものはすべてawkへの指示です
  • BEGIN{FS=OFS=":"}:入力と出力の両方の区切り文字として使用します。FSFieldSeparatorの略です。OFSOutputFieldSeparatorの略です。
  • if (NR==1) {$3 = "XXXX"};:これまでに読み取ったレコード数(NR)が1の場合、3番目のフィールド($3)を「XXXX」に設定します。
  • print:現在の行を印刷します
  • input_file:入力ファイルの名前。

代わりに、実行しようとしているのがファイル内のすべての出現箇所を単純に置き換えることである場合は、次のようにCCCXXXXます。

sed -i 's/CCC/XXXX/g` input_file

ABCCCDDこれは、 ->などの部分一致も置き換えることに注意してくださいABXXXXDD

于 2012-11-27T16:49:42.270 に答える
1

これはあなたのために働くかもしれません(GNU sed):

sed -r 's/^(([^:]*:?){2})CCC/\1XXXX/' file

また

awk -F: -vOFS=: '$3=="CCC"{$3="XXXX"};1' file
于 2012-11-27T16:58:25.470 に答える