【问题标题】:Why does my awk command print an extra line?为什么我的 awk 命令打印多行?
【发布时间】:2012-04-03 01:13:43
【问题描述】:

我发现很难调试我的 shell 脚本。我有以下文件 test.csv

The Gardens,Gard (AUS),AEST,NSW,,Sandown Park,SPrk (AUS),AEST,VIC,,Grade 5,GR5,
Wentworth Park,WPrk (AUS) ,AEST,NSW,,The Meadows,Mead (AUS),AEST,VIC,,Juvenille,JUV,
Angle Park,AnPk (AUS),ACST,SA,,Warragul,Wgul (AUS),AEST,VIC,,,,

WPrk (AUS) 有一个额外的尾随空白,我希望对其进行修剪然后打印。跑步

awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv

生产

Gard (AUS):
Wentworth Park WPrk (AUS) AEST NSW  The Meadows Mead (AUS) AEST VIC  Juvenille JUV
WPrk (AUS):
AnPk (AUS):

这是我想要的,除了第二行我不知道为什么会出现

【问题讨论】:

  • 试试printf(fmt, a1, a2, ...)
  • 试试不打印$2 可能吗?

标签: linux bash shell awk


【解决方案1】:
awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv

由于您在任何操作块 ({...}) 之外都有 gsub,因此每行都会对其进行评估作为条件。它返回它所做的替换次数,因此它将在大多数输入上返回 0,但在您要更改的行上返回 1。由于没有伴随它的动作,因此执行默认动作,打印该行;这就是您打印整行的原因。

正如其他人所说,修复方法是将 gsub 调用放在操作块中。

(另外,为什么\,?逗号不是shell中的特殊字符。)

【讨论】:

    【解决方案2】:

    你写道:

    awk -F\, 'gsub(/[ \t]+$/, "", $2); {print $2 ":"}' test.csv
    

    这个坏了。

    awk 脚本的格式是一堆结构,如下所示:

    条件 { 命令; ... }

    这里的想法是输入数据中的每一行都根据条件进行评估。如果匹配,则执行相应大括号中的命令。所以你可能想要的更多是这样的:

    awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":";}' test.csv
    

    请注意,您不需要转义字段分隔符,除非您的 shell 将其处理得不好(即,如果它是一个竖线,|,而不是逗号)。通过排除脚本中的条件,您可以在每一行上执行花括号命令。因此,无论是否需要修剪,这都会修剪 $2,然后根据您的问题中的示例打印结果。

    【讨论】:

    • 它在语法上并没有被破坏,只是在逻辑上。事实上,它被评估为一个条件。
    【解决方案3】:

    如何将命令更改为:

        awk -F, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}' test.csv
    

    这是将“{”移到前面。

    已编辑 正如其他人所说,您不需要转义逗号,-F, 就足够了。感谢其他回答者:)。

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 2013-12-14
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多