这是我的脚本,非常适合一个文件:
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")
重新格式化以提高可读性
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 '...' eq5_*.gro
,但我不会仔细查看您的awk
,也不会质疑在BEGIN子句中进行所有处理的智慧(但我会提到这是一个坏习惯)。但您可以这样做:
for num in {1..100}; do
awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done