【问题标题】:Running an awk by splitting the lines通过拆分行来运行 awk
【发布时间】:2012-07-17 20:18:19
【问题描述】:

这是 awk 中的一个基本问题。但我在这方面面临问题,我不知道为什么。问题是当我在一行中运行 awk 命令时,例如

awk 'BEGIN {} {print $0;}' FILE 

那么代码就完美运行了

但是,如果我将代码拆分为诸如

之类的行之间
 awk '
 BEGIN
 {
 }
 {
      print $0;
 }' FILE

它给了我一个错误,指出 BEGIN 应该有一个动作部分。我想知道,因为它与我正在格式化的代码相同,为什么会出现此错误。解决这个问题对我来说真的很重要,因为我会在 awk 中编写大量代码,我很难每次都格式化并将其放在一行中。你能帮我解决这个问题吗?谢谢你。笔记。我在 shell 环境中运行这个 awk

【问题讨论】:

  • 如果您的 BEGIN 块中不需要任何代码,则应将其删除。否则...相信错误消息告诉您的内容! ;-) 尝试awk 'BEGIN {}; {print $0;}' FILE 看看是否会产生错误消息。祝你好运。

标签: shell awk


【解决方案1】:

添加'{' right after theBEGIN`,您将不会收到错误消息。

BEGIN 的开头括号 { 需要在 same 行上作为 BEGIN。所以改变你所拥有的

awk '
 BEGIN
 {

awk '
 BEGIN {

您不会收到错误消息。

manual 确实声明“BEGIN 和 END 规则必须有操作;”,所以这可能是另一个问题。这个

awk 'BEGIN {} ...

对我来说似乎有点奇怪(如果什么都没发生,真的没有理由要这样做)

@Birei 下面的有用评论解释了这些语句的“解析方式在两种情况下都会有所不同。下一行中的打开 '{' 被解析为没有模式的操作(与 BEGIN 无关),而在同一行表示 BEGIN 规则的空动作。”

【讨论】:

  • +1,两种情况下的解析都会不同。下一行的 open paren 被解析为没有模式的动作(与BEGIN 无关),而同一行中的则表示BEGIN 规则的空动作。
  • 当然你可以随心所欲地完成你自己的答案,不用担心功劳,我不介意:-)
  • @Birei:这不是开括号,而是开括号。
  • @DennisWilliamson 我会做出改变,但作为英语不是他们的第一语言的人,我一直认为([{ 都被认为是括号,使用方形,卷曲等只是限定符 .. 你可以在 SO 上学到的东西 .. :)
  • 在美式英语中,( 是一个括号。在英式英语 IIRC 中,它是一个“圆括号”
猜你喜欢
  • 2021-05-07
  • 2022-08-18
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多