Awk 脚本中的 For 和 If (bash)

For and If in Awk scripts (bash)

我的bash命令是

awk -f code.txt input.txt

这是我的代码

{z=0
for(i=2;i<17;i++)
    if ($i=="y")
        z++
print  " " z}

这是我的输入

AaA y n y n y n n n y n n n n n y
BbB n y y n n n n n n n n n n n n

我的输出应该是

AaA 5
BbB 2

然而它是

AaA 4
BbB 2

修改代码后,它似乎没有注册一行的最后一个符号。

{z=0
for(i=2;i<18;i++)
        print $i
print  " " z}

当我 运行 输出所有 y/n 时,所以问题一定出在 if 语句中。

您的输入文件可能有 MS-DOS 行结尾 (CRLF)。最后一个符号将读作 y<CR>。要检查这是否属实,在 Linux 系统上,您可以 运行

hexdump -C input.txt

问题似乎出在 CRLF。您可以使用

在 awk 循环中修复它
sub(/\r/,"",$NF)

即。通过从最后一个字段中删除 CR(替换为空)。此外,您可以使用 subgsub 来计算 y 的出现次数:

$ awk '[=11=]= OFS gsub(FS "y","&")' file
AaA 5
BbB 2

这样 \r 并不重要,因为我们只需将 y 替换为自身 (&)。