我有一个制表符分隔两列数据。我希望根据第二列应用的条件得到第三个。
如果第二列不等于零,则应打印col 1和3以及col1 / col2的比率 如果col 2为零且col 1超过15,则应该打印col 1和col2以及col1中的值(col 3中)else(当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
显然我做错了,请帮助我正确处理上述代码。
谢谢
答案 0 :(得分: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
- &gt; else if
也$1
15
,而非$2
,然后你的oneliner也会工作。
答案 1 :(得分: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
答案 2 :(得分:1)
awk '{$3=$1>=15 && $2==0?$1:$1<15 && $2==0?0:$1/$2}1' your_file
答案 3 :(得分: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