awk设置外部变量问题:无法赋值x统计文件列数
问题分析与解决
你的问题核心在于awk运行在独立的子进程中,你在awk内部定义的x变量和外层shell的x不是同一个变量——awk里的x只在awk的执行环境里生效,根本传不到外层shell中,所以你的shell变量x始终是一开始赋值的1,这就是为什么输出全是1.txt。
另外你的脚本还有个语法小问题:done <$1 data.txt是错误的,要么用输入重定向读data.txt,要么读参数传入的文件,不能同时写两个。
下面给你两种解决方案:
方案1:修正原脚本,把awk的结果传递给shell变量
用命令替换$(...)把awk输出的列数捕获到shell的x变量中:
while read -r p; do # awk默认以空格分隔列,-F' '可以省略 x=$(echo "$p" | awk '{print NF}') file="${x}.txt" echo "$file" done < data.txt
这里read -r是为了避免转义字符被意外解析,属于更安全的写法。
方案2:用awk直接处理整个文件(更高效)
其实完全不需要shell的while read循环,awk可以直接遍历整个文件,效率更高(尤其是处理大文件时):
awk '{print NF ".txt"}' data.txt
这个命令会直接读取data.txt的每一行,输出列数.txt的格式,和你期望的输出完全一致。
为什么原脚本不生效?
再拆解下你原脚本的问题点:
echo $p | awk -F' ' '{x=NF}':这行只是在awk内部给变量x赋值为当前行的列数,但没有任何输出,shell根本拿不到这个值。- 后面的
echo $x输出的是你一开始在shell里设置的x=1,和awk里的x毫无关系。
内容的提问来源于stack exchange,提问作者Bhawan
相关产品推荐
相关产品推荐

