我想在我的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.
答案 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”时,它可以正常工作。我对那个不好。