4

awk3列のデータセットの2番目の列をチェックし、ゼロでない場合はその値を置き換えるために使用しようとしています。この正規表現でゼロ以外の数値を見つけることができましたが、 と組み合わせgsubprint内容を置き換えて新しいファイルに出力する方法がわかりません。gsub最初または3番目ではなく、2番目の列でのみ実行したい。これを行うための簡単なawkワンライナーはありますか? それとも、もっと複雑なことをしようとしていますか? ゼロをチェックする式を実行しようとさえしましたが、で if/else ステートメントを実行する方法がわかりませんawk

私が半成功したコマンドは次のとおりです。

awk '$2 != 0 {print $1, 1, $3}' input > output

問題は、2 番目の列がゼロの場合、行が出力されないことです。これは、どちらかまたはif/elseステートメントが機能すると思った場所ですが、構文がわかりgsubません。awkこれに関するガイダンスをいただければ幸いです。

4

2 に答える 2

8

awk では、0 でないものはすべて true であることに注意してください (ただし、"0" 以外の文字列も true です)。そう:

awk '$2 { $2 = 1; print }' input > output

では$2ない場合、 は true と評価されます0。残りは明らかです。これにより、スクリプトが複製されます。

$2 にゼロがある行を含むすべての行を印刷したい場合は、次のようにします。

awk '$2 { $2 = 1 } 1' input > output

これは上記と同じ置換を行いますが1、最後の は「true」の省略形です。ステートメントがなければ、デフォルトのステートメント{print}が実行されます。

これはあなたが探しているものですか?

実際には、次のようになります。

[ghoti@pc ~]$ printf 'none 0 nada\none 1 uno\ntwo 2 tvo\n'
none 0 nada
one 1 uno
two 2 tvo
[ghoti@pc ~]$ printf 'none 0 nada\none 1 uno\ntwo 2 tvo\n' | awk '$2 { $2 = 1 } 1'      
none 0 nada
one 1 uno
two 1 tvo
[ghoti@pc ~]$ 
于 2012-11-29T05:19:09.120 に答える
3

これは、あなたの望むことですか?

awk '$2 != 0 {print $1, 1, $3} $2 == 0 {print}' input > output

またはsedを使用:

sed 's/\([^ ]*\) [0-9]*[1-9][0-9]* /\1 1 /' input > output
于 2012-11-29T05:11:50.940 に答える