Bash 如何在awk中使用搜索模式中的i循环

Bash 如何在awk中使用搜索模式中的i循环,bash,awk,Bash,Awk,我试图在一个大数据文件中计算包含末尾数字的字符串,为此,使用for I循环连续搜索所有字符串。这是我的密码: #!/bin/bash for (( i=2; i<=253; i++ )) do awk -F "\t" '$3 ~ /^names.i$/ {++c} END {print c}' myfile >> output.txt done 出于某种原因,尽管使用awk只能提供正确的输出,但脚本在shell中只生成空空格。我做错了什么?您不能像那样在awk中直接使用she

我试图在一个大数据文件中计算包含末尾数字的字符串,为此,使用for I循环连续搜索所有字符串。这是我的密码:

#!/bin/bash
for (( i=2; i<=253; i++ ))
do
awk -F "\t" '$3 ~ /^names.i$/ {++c} END {print c}' myfile >> output.txt
done

出于某种原因,尽管使用awk只能提供正确的输出,但脚本在shell中只生成空空格。我做错了什么?

您不能像那样在awk中直接使用shell变量I。首先将其传递给awk:

for (( i=2; i<=253; i++ ))
do
   awk -v i=$i -F "\t" '$3 ~ "^names\." i "$" {++c} END {print c}' myfile >> output.txt
done

不能像那样在awk中直接使用shell变量i。首先将其传递给awk:

for (( i=2; i<=253; i++ ))
do
   awk -v i=$i -F "\t" '$3 ~ "^names\." i "$" {++c} END {print c}' myfile >> output.txt
done
试试这个

awk -F "\t" '{for (i=2;i<=253;i++) if ($3 ~ /^names.i$/) ++c} END {print c}' myfile
试试这个

awk -F "\t" '{for (i=2;i<=253;i++) if ($3 ~ /^names.i$/) ++c} END {print c}' myfile

只需在1 awk调用中完成整个过程:

awk -F '\t' '
{ split($3,arr,/\./); ++c[arr[2]] }
END { for (i=2;i <= 253;i++) print c[i]+0 }
' myfile > output.txt

只需在1 awk调用中完成整个过程:

awk -F '\t' '
{ split($3,arr,/\./); ++c[arr[2]] }
END { for (i=2;i <= 253;i++) print c[i]+0 }
' myfile > output.txt

非常感谢你,Ed,我一整天都在试着这么做,效果很好!非常感谢!非常感谢你,Ed,我一整天都在试着这么做,效果很好!非常感谢!是的,我也尝试过这个,但出于某种原因,它只会给出空输出:不能在文本regexp/^names中包含变量I。I$/-它被视为字符,我就像该RE中的其他每个字母一样。是的,我也尝试过这个,但出于某种原因,它只会给出空输出:不能在文本regexp/^names中包含变量i。i$/-它被视为字符i,就像RE中的其他每个字母一样。谢谢,这很有效,尽管会给出警告并打印空空格而不是零,因此,我将使用Ed Morton的答案。警告是因为在使用字符串包含REs时需要双转义字符,因为字符串文本会被解析两次,一次是在读取脚本时,另一次是在脚本执行时,因此需要\\。而不是\。。空格是因为如果要在c未设置时获得数字而不是空字符串输出,则需要使用print c+0或printf%d\n,c。感谢您的评论,现在我知道我和其他人做错了什么。谢谢,这很有效,尽管会给出警告并打印空空格而不是零,因此,我将使用Ed Morton的答案。警告是因为在使用字符串包含REs时需要双转义字符,因为字符串文本会被解析两次,一次是在读取脚本时,另一次是在脚本执行时,因此需要\\。而不是\。。空格是因为如果要在c未设置时获得数字而不是空字符串输出,则需要使用print c+0或printf%d\n,c。感谢您的评论,现在我知道我和其他人做错了什么。