【问题标题】:awk with nested if else带有嵌套 if else 的 awk
【发布时间】:2013-02-26 10:27:21
【问题描述】:

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

如果第二列不等于 0,它应该打印 col 1 和 3 以及 col1/col2 的比率 如果 col 2 为零且 col 1 大于 15,则它应该打印 col 1 和 col2 以及 col1 中的值(在 col 3 中),否则(当 col1

例如,对于这样的文件

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

显然我做错了什么,请帮我把上面的代码弄对。

谢谢

【问题讨论】:

    标签: bash awk nested-if


    【解决方案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 还要检查 $115,而不是 $2,然后你的 oneliner 也可以工作。

    【讨论】:

      【解决方案2】:

      这是另一种选择:

      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
      

      【讨论】:

        【解决方案3】:
        awk '{$3=$1>=15 && $2==0?$1:$1<15 && $2==0?0:$1/$2}1' your_file
        

        【讨论】:

          【解决方案4】:

          方式略有不同:

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-07-08
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            • 2015-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多