2

私が awk で気に入っているのは、指定した任意のフィールドの条件を満たすファイルからすべての行を取得できることです。例えば、

awk '$3~/hi/' < test.txt # print all lines where the third field matches the pattern "hi"

また

awk '$2>=2' < test.txt  # print all lines where the second field is greater or equal to 2

UNIX のパワーについて学んでいる初心者として、私はこれに完全に魅了されています。指定した任意のフィールドでのみ正規表現置換を実行する簡単な方法があるかどうか疑問に思っていますか? たとえば、3 番目のフィールドのみで正規表現置換を行いたいとします。私の現在の方法は、必要なフィールドを「切り取り」、perlまたはsedを使用してそのフィールドを置換し、それを元のファイルに「貼り付ける」ことです。しかし、これを達成するためのより効率的な方法があるかどうか疑問に思っています。

ありがとう

4

3 に答える 3

4

この質問に「perl」(「sed」、「awk」、「unix」、「command-line」に加えて)のタグを付けたので、上記のツールのいずれかを組み込んだ回答に興味があると思います.

Perl には、自動分割コマンドライン スイッチ ( -a) があります。

perl -lane 'print if $F[2] =~ /some pattern/' filename

...また...

perl -lane 'print if $F[1] >= 42' filename

-a@F配列 への自動分割を引き起こします。-nフィードしたファイルの行を Perl に反復処理させます。あとはプログラミングです。;)

代わりに:

perl -i.bak -lane '$F[2] =~ s/match/subst/; print join q/ /, @F' filename

または、-pPerl に各行を$_. つまり、 を変更@Fした場合は、それを にコピーして戻す必要があります$_

perl -i.bak -pale '$F[2] =~ s/match/subst/ && $_="@F"' filename
于 2012-05-23T06:07:04.290 に答える
3

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

echo -e 'Fred barney Wilma\nfoo bar baz' |
awk '$2 == "barney"{sub(/b/,"B",$2)};1'
Fred Barney Wilma
foo bar baz

subgsubコマンド、またはこのケースを使用できます。

echo -e 'Fred barney Wilma\nfoo bar baz'|
awk '$2 == "barney"{$2="Barney"};1'
Fred Barney Wilma
foo bar baz

2 番目のフィールドを完全に置き換えるだけです。

注:1行末の は の短縮形です{print}

于 2012-05-23T06:37:36.123 に答える
1

簡単な例を考えてみましょう。

awk -F "," '{ OFS=","; sub ("1", "x", $3); print $0 }' file.txt > newfile.txt

newfile.txtこれで、次のものが含まれます。

1,2,3,4,5,6,7
8,9,x0,11,12,13,14
15,16,x7,18,19,20,21

ここでは、3番目の列1のに置き換えられました。入力ファイルの区切り文字を設定します。 出力にコンマを追加します。x$3
-F ","OFS=","

グローバルに置換する場合は、のgsub代わりにを使用することを検討してsubください。

HTH

于 2012-05-23T07:08:14.417 に答える