0

2列のデータで区切られたタブがあります。2列目に適用された条件に基づいて3番目を取得したいと思います。

2番目の列がゼロに等しくない場合は、列1と列3を出力し、列2がゼロで列1が15を超える場合は、列1と列2および列1の値(列3)を出力する必要があります。 )else(col1 <= 15&col2が0の場合)col1col2および0を出力する必要があります。

たとえば、このようなファイルの場合

1   2
4   5
6   7
14  0
18  0

出力は次のようになります

1   2   0.5
4   5   0.8
6   7   0.85
14  0   0
18  0   18

私が試したこと:

awk '{if ($2!=0) print $1 "\t" $2 "\t" $1/$2; elseif($2>15) print $1 "\t" $2 "\t" $1 ; else print $1 "\t" $2 "\t" $2}'<tags| head

明らかに私は何か間違ったことをしています。上記のコードを正しく理解するのを手伝ってください。

ありがとうございました

4

4 に答える 4

1

面白いけど読めない(たぶん):)ワンライナー:

 awk '{$0=$2?$1FS$2FS$1/$2:$1>15?$1FS$2FS$1:$1FS$2FS"0"}1' file

簡単な説明:

a=boolean? first : second

this means assign var a, if boolean true, using value first, otherwise use value second.

I set `$0 = $2? FOO : BAR`
FOO part: $1 FS $2 FS $1/$2
BAR part: $1>15? FOO2 : BAR2
    FOO2 part: $1 FS $2 FS $1
    BAR2 part: $1 FS $2 FS "0"

finally, print $0

コードの問題

chang- elseif>else if も確認$1してください。そうし15ないと$2、ワンライナーも機能しません。

于 2013-02-26T10:35:45.423 に答える
1

別の方法は次のとおりです。

awk '!$2 { $3 = $1>15 ? $1 : 0 } $2 { $3 = $1/$2 } 1' OFS='\t' CONVFMT='%.2g'

出力:

1   2   0.5
4   5   0.8
6   7   0.86
14  0   0
18  0   18
于 2013-02-26T10:55:39.390 に答える
1
awk '{$3=$1>=15 && $2==0?$1:$1<15 && $2==0?0:$1/$2}1' your_file
于 2013-02-26T10:56:03.790 に答える
1

少し異なる方法:

awk '{if($2!=0) $3=$1/$2; else if($1>15) $3=$1; else $3=0}1' OFS='\t' file

if句の順序によって決定されます。

awk '{$3=0} $1>15{$3=$1} $2{$3=$1/$2}1' OFS='\t' file

または不可解なバージョン:

awk '{$3=$2?$1/$2:$1>15?$1:0}1' OFS='\t' file
于 2013-02-26T11:32:22.543 に答える