如何将BASH shell变量作为getline中的字符串传递给AWK?

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

这是我的脚本,非常适合一个文件:

awk 'BEGIN {while (getline < "eq5_1.gro") {if ($1 ~ /MGD/ && ($NF < 3.477 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240)) name[$1]=$1}} {if ($1 != name[$1]) print}' 
eq5_1.gro | tee eq6_1.gro

我想在100个文件上使用此脚本,所以我编写了此脚本。

num=1
for num in {1..100}
do
    awk 'BEGIN {while (getline < "eq5_"'$num'".gro") {if ($1 ~ /MGD/ && ($NF < 3.477 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240)) name[$1]=$1}} {if ($1 != name[$1]) print}'            eq5_$num.gro | tee eq6_$num.gro
done

我对这部分代码有问题

(getline < "eq5_"'$num'".gro")

如何在此处将数字作为字符串?我要在这里为所有100个文件保存eq5_1.gro eq5_2.gro等我也尝试了这个,没用

awk -v var="$num" 'BEGIN {while (getline < "eq5_"'$var'".gro")
bash shell awk text-processing
2个回答
1
投票

重新格式化以提高可读性

awk '
    BEGIN {
        while (getline < "eq5_1.gro") {
            if ($1 ~ /MGD/ && ($NF < 3.477 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240)) 
                name[$1]=$1
        }
    }
    {if ($1 != name[$1]) print}
' eq5_1.gro

所以您要打印符合该条件的行?

您的awk命令可以大大简化,并且您不需要处理该文件两次。

awk '! ($1 ~ /MGD/ && ($NF < 3.477 || $NF > 7.947 || $(NF-1) < 12.741 || $(NF-1) > 22.240))' eq5_1.gro

参考awk info page


0
投票

[您似乎应该只做:awk '...' eq5_*.gro,但我不会仔细查看您的awk,也不会质疑在BEGIN子句中进行所有处理的智慧(但我会提到这是一个坏习惯)。但您可以这样做:

for num in {1..100}; do
    awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done
© www.soinside.com 2019 - 2024. All rights reserved.