【问题标题】:How to add output "non_assigned" when there is no match in grep?当grep中没有匹配时如何添加输出“non_assigned”?
【发布时间】:2020-10-20 23:44:38
【问题描述】:

当我在输入文件 (input.txt) 的一行上运行命令 (COMMAND) 时,我会得到一个相关的结果,其中只有一行是有趣的,总是从世界门开始。

例如:

superkingdom    2759    Eukaryota
clade   554915  Amoebozoa
phylum  555280  Discosea
order   313555  Himatismenida
family  313556  Cochliopodiidae

所以我跑了:

for p in $(cat input.txt) 
    do COMMAND $p | grep "\bphylum\b" >> results.txt
done

为了在我的文件 result.txt 中包含所有行,例如:

phylum  555280  Discosea

但是,有时 grep 没有结果(没有以 phylum 开头的行),它不会在 results.txt 中添加任何行。例如,我想为这些特定情况添加一些带有“0”或“未分配”的行(因此 input.txt 的每一行都与 results.txt 匹配)。

clade   2696291 Ochrophyta
class   5747    Eustigmatophyceae
order   425074  Eustigmatales
family  425072  Monodopsidaceae

我已尝试添加 | awk print '{print $0"non_assigned"}' ,不成功。

你有什么想法可以帮助我吗?一位成员建议我使用 awk '/phylum/{print $0}!/phylum/{print "non_assigned";exit} 但即使存在 phylum 结果,我也会得到输出“non_assigned”。

【问题讨论】:

  • awk '/phylum/{print $0}!/phylum/{print "non_assigned"}'
  • 不幸的是,当我使用你的命令时,我仍然没有任何输出
  • 你需要删除grep并且只使用awk
  • 我不知道为什么它被关闭了,但这会起作用:for p in $(<input.txt); do (COMMAND $p | grep -w "phylum") || echo "non_assigned"; done >> results.txt 请注意,重定向已移至 done; 之后。现在使用> 而不是>> 可能会更好。
  • 非常感谢@JonathanLeffler,它运行良好!

标签: linux bash grep


【解决方案1】:

这样就可以了:

for p in $(<input.txt)
do
    (COMMAND $p | grep -w "phylum") || echo "non_assigned"
done >> results.txt

这会在子shell 中运行命令和grep。如果grep 找到'phylum',则|| 的RHS 不会运行;如果没有找到 'phylum',则执行 echo 以输出合适的标记。

注意重定向已经移到done之后;现在使用&gt; 可能比&gt;&gt; 更好。

当心set 选项-o pipefail — 如果命令失败,您可能需要使用set +o pipefail。但是,默认情况下它是禁用的,所以你可能会没事的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2011-04-23
    • 2012-06-04
    • 2014-06-24
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多