Как передать переменные оболочки BASH в AWK как строку в getline? - PullRequest
0 голосов
/ 19 марта 2020

Это мой скрипт, и он отлично работает для одного файла:

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

I есть проблема с этой частью кода

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

Как я могу поставить здесь число в виде строки? Я хочу иметь здесь eq5_1.gro eq5_2.gro et c. для всех 100 файлов я тоже попробую, не получилось

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

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Похоже, вы должны просто делать: awk '...' eq5_*.gro, но я не собираюсь подробно останавливаться на вашем awk или ставить под сомнение целесообразность выполнения всей вашей обработки в предложении BEGIN (но я буду упомянуть, что это плохая практика). Но вы можете сделать:

for num in {1..100}; do
    awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done
1 голос
/ 19 марта 2020

Переформатирование для удобства чтения

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

...