【问题标题】:Print specified text if string is empty using AWK如果字符串为空,则使用 AWK 打印指定的文本
【发布时间】:2012-06-28 15:32:57
【问题描述】:

如果字符串为空,我正在尝试使用awk 打印特定文本。在以下情况下它可以正常工作

noob@noob:~$ echo "" | awk '{if ($0=="") print "not playing"}'
not playing

但是当我尝试在以下情况下采取类似的方法时,它不起作用

noob@noob:~$ mpc current | awk '{if ($0=="") print "not playing"}'
noob@noob:~$ 

如果没有歌曲正在播放,我相信mpc current 的输出是一个空字符串。

noob@noob:~$ mpc current
noob@noob:~$              #empty string

那么,我对empty string 的假设是错误的吗?

【问题讨论】:

  • mpc current | awk '{print "X$0X"}'的结果是什么
  • 打印nothing。它的输出与我上面提到的mpc current 相同。
  • awk 处理“行”。如果mpc current 没有输出,则没有要处理的行。
  • @Noob 只是为了确认mpc current的输出不是" ",(即单个空格)

标签: string awk


【解决方案1】:

显然它根本不打印任何内容,甚至没有换行符。试试这个吧。

mpc current | awk '{ print } END { if (!NR) print "not playing" }'

这会打印任何输出。如果你不想这样,请取出{ print }

awk 依次处理每一行,然后在 EOF 处执行任何 END 块。如果没有输入行,则在开头将有一个 EOF,变量NR 将为零,因此 END 块将打印占位符文本。 (我最初为此有一个专用变量,但 Bob Vale 的答案中使用的内置行号变量 NR 显然更加优雅。awk 读取的每个输入行都会递增。)

【讨论】:

  • 谢谢,它运行良好。你能解释一下你在这里做了什么吗?
  • 根据@Karl Nordström 的编辑建议添加了解释。
【解决方案2】:

试试

mpc current | awk 'END { if (NR==0) print "not playing"}'

【讨论】:

  • 如果要输出结果,可以在END前加{print}
【解决方案3】:

这真的是awk 的工作吗?在我看来,就像行数的简单问题:

mpc current | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi

以上代码计算mpc current输出的最长行的长度,如果是0则打印“not playing”。

这是它的行为方式:

$ echo ""       | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
not playing
$

$ echo -n ""    | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
not playing
$

$ echo "foo"    | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
$

$ echo -n "foo" | if [[ $(wc -L) -eq 0 ]]; then echo "not playing"; fi
$

正如 William Pursell 在他们的评论中所说,您也可以这样做:

mpc current | grep -q . || echo "not playing"

这也不需要bash

【讨论】:

  • 当然,如果 OP 希望它在输入为 foo 的情况下打印 foo,这将不起作用
  • @BobVale - OP 发布的原始 sn-p 不会重现输入。我认为这是必需的行为。另外,在编写脚本时,我更喜欢依赖 GNU coreutils 而不是依赖 GNU awk。
  • 但是为什么要接受bash 依赖呢?您可以更简单地执行此操作(并且不需要 bash):mpc current | grep -q . || echo "not playing" 请注意,这很容易满足 Bob 的批评,因为您可以省略 -q
  • @WilliamPursell - +1。这应该是一个答案。如果你写一个,我会很感激。如果没有,我会继续编辑它。至于为什么要接受bash 依赖项?,我从来没有想过。这是我唯一使用的外壳。你当然是对的。
  • grep . 不计算空行。如果这对您有影响,请改用grep '^'grep 方法明显优于计算输出行数的反模式。
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多