如何将 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 '...' eq5_*.gro
,但我不会仔细研究您的 awk
或质疑在 BEGIN 中进行所有处理是否明智条款(但我会提到这是不好的做法)。但你可以这样做:
for num in {1..100}; do
awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done
这是我的脚本,非常适合一个文件:
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 '...' eq5_*.gro
,但我不会仔细研究您的 awk
或质疑在 BEGIN 中进行所有处理是否明智条款(但我会提到这是不好的做法)。但你可以这样做:
for num in {1..100}; do
awk -v file="eq5_${num}.gro" 'BEGIN {while (getline < file) ...} '
done