为什么我的awk命令会打印一个额外的行?

时间:2012-04-03 01:13:43

标签: linux bash shell awk

我发现调试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):

这是我想要的,除了第二行我无法弄清楚为什么出现

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

如何将命令更改为:

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

那是'{'向前移动。

<强>被修改 正如其他人所说,你不需要转义逗号,-F,就足够了。感谢其他回答者:)。

答案 2 :(得分:2)

您写道:

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

这已经破了。

awk脚本的格式是一堆看起来像的结构:

   condition {
     command; 
     ... 
    }

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

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

请注意,您不需要转义字段分隔符,除非您的shell会严重对待它(例如,如果它是竖条,|,而不是逗号)。通过排除脚本中的条件,可以在每条线上执行花括号命令。因此,无论是否需要修剪,都会修剪2美元,然后根据您的问题在您的问题中打印结果。