0

我有一个制表符分隔两列数据。我想根据第二列上应用的条件获得第三个。

如果第二列不等于零,它应该打印 col 1 和 3 以及 col1/col2 的比率如果 col 2 为零并且 col 1 大于 15,则它应该打印 col 1 和 col2 以及 col1 中的值(在 col 3 ) 否则(当 col1<=15 & col2 为 0 时)它应该打印 col1 col2 和 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 '{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 回答
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你的 oneliner 也可以工作。

于 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 回答