我发现调试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):
这是我想要的,除了第二行我无法弄清楚为什么出现
答案 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美元,然后根据您的问题在您的问题中打印结果。