[英]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.