来自awk中嵌套for循环的bash变量

时间:2020-10-06 21:22:45

标签: bash awk

我想在我的awk代码中简单地使用两个for循环变量,但是不能。请帮助或指导我正确的方向。

for i in {30,60,100}; 
do 
   for j in {7,8}; 
   do 
       awk -v x=$i -v y=$j '{if ($NF <=x) print $0}' S_$i.txt > S_$i_$j.txt;
   done;
done

这是我收到的错误。

awk: fatal: cannot open file S_.txt for reading (No such file or directory). I saw this error.

2 个答案:

答案 0 :(得分:4)

S_$i_$j.txt试图访问名为$i_的变量。改用S_${i}_${j}.txt,但也总是引用您的shell变量,因此它实际上应该是:

awk -v x="$i" -v y="$j" '{if ($NF <= x) print $0}' "S_${i}.txt" > "S_${i}_${j}.txt"

或更尴尬的是:

awk -v x="$i" -v y="$j" '$NF <= x' "S_${i}.txt" > "S_${i}_${j}.txt"

请注意,您永远不会在awk脚本中使用y,因此它可能是:

awk -v x="$i" '$NF <= x' "S_${i}.txt" > "S_${i}_${j}.txt"

但是不清楚为什么要在每个内部循环中创建2个输出副本。

不过,无论您做什么,几乎可以肯定,一次调用awk会比在shell循环中多次调用它快得多!

您所询问的问题与for loop variables in my awk code绝对没有关系,这全都是Shell基础知识。

答案 1 :(得分:1)

感谢您的快速回复。 但是,我尝试了以下方法并成功了:

for i in {30,60,100}; 
    do 
     for j in {7,8}; 
      do 
       awk -v x=$i -v y=$j '{if ($NF <=x) print $0}' "S_"$j".txt" > "S_"$j"_"$i".txt";
      done;
    done;

此外,我意识到S_30.txt不存在。因此,当我将其更改为“ S _” $ j“ .txt”时,它可以正常工作。我对那个不好。