我编写了一个脚本,我想在其中计算data.txt中的列数。我的问题是我无法在awk脚本中设置x。任何帮助将受到高度赞赏。
while read p; do
x=1;
echo $p | awk -F' ' '{x=NF}'
echo $x;
file="$x"".txt";
echo $file;
done <$1
data.txt文件:
4495125 94307025 [email protected] 94307025.094307025 12443
stazla [email protected] 1992/.:\1
1447585 [email protected] h1st@1
saknit [email protected] 1233 1990
预期产量:
5.txt
3.txt
3.txt
4.txt
我的输出:
1.txt
1.txt
1.txt
1.txt
您无法将Awk
中的变量集导入shell上下文。在您的示例中,包含x
的NF
中设置的值将不会反映在外部。
您需要使用命令替换($(..)
)语法来获取NF
的值并在以后使用它
x=$(echo "$p" | awk '{print NF}')
现在x
将包含每行中的列数。请注意,您不需要使用-F' '
,这是awk
中的默认去限制器。
此外,您的要求可以在Awk
本身完全完成。
awk 'NF{print NF".txt"}' file
这里的NF{..}
是为了确保{..}
中的动作仅应用于非空行。每行我们打印长度并附加扩展名.txt
。
Awk一次处理一行 - 在shell while read
循环中处理单独的Awk脚本中的每一行是极其低效的。另见https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice
也许是这样的:
awk '{ print >(NF ".txt") }' data.txt
创建一个文件,其中包含5.txt
中的五列行,4.txt
中的四列行,2.txt
中的三列行等,用于每个唯一列数。
Awk变量NF
包含字段数(默认情况下,awk在空格运行时拆分字段 - 使用-F
更改为其他分隔符),表达式(NF ".txt")
只生成字符数casenation,后缀为.txt
。我们作为文件名传递给print
重定向。
用bash:
while read p; do p=($p); echo "${#p[@]}.txt"; done < file
或更短:
while read -a p; do echo "${#p[@]}.txt"; done < file
输出:
5.txt 3.txt 3.txt 4.txt