【问题标题】:awk to print message based on data in the same fileawk 根据同一文件中的数据打印消息
【发布时间】:2018-06-21 02:46:28
【问题描述】:

我正在尝试使用awk 打印一条消息,具体取决于使用相同tab-delimeted file 中的数据的不同条件。也就是说,---positive file--- 正在被使用,那么这两个条件都满足并且变量 count 为 2,因此被打印出来。这似乎可行,但是当我尝试为---negative file--- 添加条件时,这两个条件不满足^ unexpected newline or end of string 是错误。我认为语法是正确的,但我遗漏了一些东西。谢谢你:)。

awk

awk -F'\t' '$1=="Control" && $2=="Present" {count++} END{print count " controls detected"} $1=="Control" && $2!="Present" {print "0 controls detected"}' file

文件 --- 否定 ---

Control NoCall
Control NoCall

文件---正文件---

Control Present
Control Present

想要的输出---负文件---

0 controls detected

想要的输出---正文件---

2 controls detected

修正后的输出:

0 controls detected
0 controls detected

【问题讨论】:

  • 您输入file的真实内容是什么?
  • 来自.tsv...的大约 40 列。我发布的两列只是以不同的顺序排列,是最重要的两列。谢谢你:)。
  • 抱歉,里面有 2800 行 :)。
  • @Chris:您是否意识到在所示示例中您有一个未终止的" 字符?
  • @Inian,谢谢你,我什至没有注意到.... 更正后我得到了0 controls detected... 可能错过了END?谢谢你:)。

标签: awk


【解决方案1】:

您的示例中似乎有一个未终止的双引号("),这可能导致语法违规。顺便说一句,您可以只使用如下所示的三元运算符,而不是搞砸多项检查

awk -F'\t' ' $1=="Control" { ($2 == "Present")?(count++):(count=0);}END{print count" controls detected"}' file

上述逻辑似乎适用于问题中的正面和负面文件。

【讨论】:

    【解决方案2】:

    为什么在 END{...} 之后放置一个额外的模式-动作对?那令人困惑。 它为满足模式/条件的每一行打印。我不认为这是故意的。

    更有可能的是,您只想在 END 处打印,默认为 count

    echo "Control\tno\nControl\tno\nControl\tno" |\
    awk -F '\t' '
        $1=="Control" && $2=="Present" { count++ }
        END { print (count?count:0) " controls detected" }
        '
    

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 2023-02-21
      • 2013-09-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多