繁体   English   中英

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

[英]Why does my awk command print an extra line?

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

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

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

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

正如其他人所说的那样,修复程序将gsub调用放在action块中。

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

如何将命令更改为:

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

那是'{'向前移动。

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

你写了:

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

这已破了。

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

 {
      
      
    }

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM