linux - 为什么我的 awk 命令多打印一行?

标签 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):

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

最佳答案

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

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

正如其他人所说,解决方法是将 gsub 调用放在操作 block 中。

(还有,为什么是 \,?逗号在 shell 中不是特殊字符。)

关于linux - 为什么我的 awk 命令多打印一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985909/

相关文章:

c - 让后台进程监听键盘输入

macos - 如何在 macOS 上使用 iterm 作为默认终端?

shell - UNIX 查找 : how to deal with paths containing spaces

bash - 拆分文本并并行处理

mysql - 在终端中使用 mysql 来抑制警告消息,但密码是用 bash 脚本编写的

c - I2C 用户空间读/写问题

linux - 下载某种类型的所有文件,不带目录

javascript - 如何使用 javascript 杀死 linux child_process.spawn?

bash - 没有匹配文件时如何跳过for循环?

linux - 使用需要输入的命令在脚本内部执行 sudo (bash)