Unix中awk命令for循环陷入无限循环的问题求助
解决awk无限循环的问题
嘿,我来帮你搞定这个问题!你现在遇到的无限循环,主要是两个小坑导致的:
第一个坑:shell变量没传给awk
你在shell里计算的nbrClients变量,awk是拿不到的——awk有自己独立的运行环境,直接在awk里写$nbrClients,它会误以为你要取当前行的第nbrClients个字段,而不是你算出来的文件行数。如果你的行里没有这个字段,这个值就是空,循环条件就会乱掉。
第二个坑:多此一举的for循环
其实awk本身就是逐行处理文件的!你写的awk '{...}' $file,awk会自动遍历文件的每一行,执行大括号里的代码。你额外套了一个for循环,等于让每一行都被重复打印N次(N本应是行数,但因为变量没传对,很可能变成不可控的数值),运气不好就会出现看起来像无限循环的情况。
正确的写法(如果只是打印每行的前3个字段)
根本不需要for循环,一行搞定:
file="$1" awk '{print $1 $2 $3}' "$file"
这样awk会自动把文件每一行的前3个字段打印出来,完美遍历所有数据。
如果确实需要用到文件行数(比如做行数相关逻辑)
那得用-v参数把shell变量传给awk,比如:
file="$1" # 优化一下行数计算,直接从stdin读wc -l,避免cut的麻烦 nbrClients=$(wc -l < "$file") echo "$nbrClients" # 用-v把nbrClients传给awk的num变量 awk -v num="$nbrClients" '{print $1 $2 $3, "当前是第" NR "行,总行数:" num}' "$file"
这里NR是awk内置变量,代表当前处理的行号,用它就能轻松跟踪行数啦。
为什么会无限循环?
假设你的文件有10行,nbrClients=10,但某一行刚好有第10个字段是一个超大的数(比如1000000),那awk里的$nbrClients就会取这个超大值,循环就会跑1000000次,看起来就像无限循环了。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

