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
(替换为空)。此外,您可以使用 sub
或 gsub
来计算 y
的出现次数:
$ awk '[=11=]= OFS gsub(FS "y","&")' file
AaA 5
BbB 2
这样 \r
并不重要,因为我们只需将 y
替换为自身 (&
)。
我的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
。您可以使用
sub(/\r/,"",$NF)
即。通过从最后一个字段中删除 CR
(替换为空)。此外,您可以使用 sub
或 gsub
来计算 y
的出现次数:
$ awk '[=11=]= OFS gsub(FS "y","&")' file
AaA 5
BbB 2
这样 \r
并不重要,因为我们只需将 y
替换为自身 (&
)。