在awk中设置外部变量

问题描述 投票:0回答:3

我编写了一个脚本,我想在其中计算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
linux bash awk
3个回答
3
投票

您无法将Awk中的变量集导入shell上下文。在您的示例中,包含xNF中设置的值将不会反映在外部。

您需要使用命令替换($(..))语法来获取NF的值并在以后使用它

x=$(echo "$p" | awk '{print NF}')

现在x将包含每行中的列数。请注意,您不需要使用-F' ',这是awk中的默认去限制器。

此外,您的要求可以在Awk本身完全完成。

awk 'NF{print NF".txt"}' file

这里的NF{..}是为了确保{..}中的动作仅应用于非空行。每行我们打印长度并附加扩展名.txt


1
投票

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重定向。


1
投票

用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
© www.soinside.com 2019 - 2024. All rights reserved.