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

How to pass BASH shell variables into AWK as a string in getline?

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

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

我对这部分代码有疑问

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

如何将数字作为字符串放在这里?我想在这里 eq5_1.gro eq5_2.gro 等所有 100 个文件 这个我也试过了,没用

awk -v var="$num" 'BEGIN {while (getline < "eq5_"'$var'".gro")

重新格式化以提高可读性

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

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

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

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

参考awk info page

看来您应该只做:awk '...' eq5_*.gro,但我不会仔细研究您的 awk 或质疑在 BEGIN 中进行所有处理是否明智条款(但我会提到这是不好的做法)。但你可以这样做:

for num in {1..100}; do
    awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done