【问题标题】:How can I exclude blank lines with awk?如何使用 awk 排除空行?
【发布时间】:2016-02-18 22:36:16
【问题描述】:

问题

如何排除以空格字符开头的行,并且该行没有其他内容?使用 awk,我想打印 Need to print 行,但它也在打印空行。如何排除?

脚本:test.awk

$0 !~/^start|^#/ {
print "Result : %s",$0
}

数据

# test

start
Need to print

结果

Result : %s 
Result : %s Need to print

【问题讨论】:

  • 当一行仅包含空白字符时,您拥有的 2 个答案的行为会有所不同 - 您需要哪种解决方案取决于您是否应将此类行视为“空白行”。跨度>

标签: awk blank-line


【解决方案1】:

使用NF变量

您实际上并不是在询问以空格开头的行,而是在询问如何丢弃空白行。务实地说,空白行没有字段,因此您可以使用内置的 NF 变量来丢弃至少没有一个字段的行。例如:

$ awk 'NF > 0 && !/^(start|#)/ {print "Result: " $0}' /tmp/corpus 
Result: Need to print

【讨论】:

  • NF > 0 可以替换为NF
  • @karakfa 可能,因为它适用于 BSD 和 GNU awk。但是,我不确定所有 awks 的便携性如何。即使它是 100% 便携的,简洁永远不会胜过意图的清晰。我总是更喜欢我的代码清楚比较,而不是使用未来读者难以推理的隐式比较。 YMMV。不过,感谢您的提示!
  • 我原则上同意,但awk 'NF' 是惯用的 awk 打印非空行。
【解决方案2】:

你可以使用:

awk '/^[^[:space:]]/{print "Result : " $0}'

使用[^[:space:]] 可确保在打印的每一行中至少有一个非空格字符。

【讨论】:

  • /^[^[:space:]]/ 中的前导 ^ 意味着它会跳过任何缩进非空格文本的行。这个问题不是 100% 清楚的,因为样本输入不包括那个案例,但这通常不是人们说他们想要 exclude lines starting with a space character, and that have nothing else on the line 时的意思。
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2013-10-13
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多