【问题标题】:Using If-Statement to assign Variable in awk在 awk 中使用 If-Statement 分配变量
【发布时间】:2020-04-14 03:20:41
【问题描述】:

我正在尝试创建一个 awk 脚本文件,该文件接受一个输入文件并将前三行的第四列信息转换为一行。 例如,如果 input.txt 如下所示:

XX YY val1 1234
XX YY val2 2345
XX YY val3 3456
stuff random garbage junk extrajunk
useless 343059 random3

我想将第 1、2 和 3 行的第四列打印成一行:

1234 2345 3456

我试图通过使用 if/else-if 语句来做到这一点,所以我的文件现在看起来像这样:

#!/usr/bin/awk -f

{
    if ($1 == "XX" && $3 == "val1") 
    {
             var1=$4; 
    }  
    else if ($1 == "XX" && $3 == "val2") 
    {
             var2=$4; 
    }
    else if ($1 == "XX" && $3 == "val3") 
    {
             var3=$4; 
    }
}

结束{ 打印 var1,var2,var3

然后我会在一行上打印变量。但是,当我尝试实现这一点时,我收到指向 var2=$4 行中的“=”符号的语法错误。

编辑

已解决,在我的真实文件中,我将变量命名为时髦(但具有描述性)名称,这一切都搞砸了。 - 糟糕。

谢谢

【问题讨论】:

  • 欢迎来到 SO,特别感谢您以代码的形式展示您的努力(继续努力)。但是您的问题不清楚,它总是建议在您的问题中添加输入/输出示例,所以请添加相同的内容并让我们知道。
  • 如果它们在 awk 代码的主体中,是否就像提醒您需要 { braces ...} 围绕这些语句一样简单?否则你会得到随机的语法错误(随机的与 awk 的版本有关...)
  • 发布一个最小的完整脚本来演示您的问题。
  • 这是我的真实变量名中的一个简单错误!谢谢大家!

标签: awk


【解决方案1】:

你可以这样写

$ awk '$1=="XX"{if($3=="val1") var1=$4
                else if($3=="val2") var2=$4
                else if($3=="val3") var3=$4}
        // .. do something with the vars ....

但是,如果您只想打印前 3 行的第四列

$ awk '{printf "%s ", $4} NR==3{exit}' ile
1234 2345 3456

【讨论】:

    【解决方案2】:

    试试这个:

    #!/bin/env bash
    awk '
    $1 == "XX" { var[$3] = $4 }
    END { print var["val1"], var["val2"], var["val3"] }
    ' "$@"
    

    根据您的实际需求,几乎可以肯定有一个更简单的解决方案,例如也许:

    awk '
    { vars = (NR>1 ? vars OFS : "") $4 }
    NR == 3 { print vars; exit }
    ' "$@"
    

    。如果没有别的,为了方便未来的增强,不要从 shebang 调用 awk,只需显式调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多