我们使用一个脚本将 bash 命令打印到一个文件中,然后在 HPC 系统上运行。它应该运行一个包含由空格分隔的地理坐标的大型文本文件,并从该文件中提取特定区域(例如,提取 x 坐标在 xmin 和 xmax 之间、y 坐标在 ymin 和 ymax 之间的所有行)。
理想情况下,我想像这样使用 awk (凭记忆,因为我没有可用的计算机 atm):
awk -v xmin=-13000 -v xmax=13000 -v ymin=-500 -v ymax=500 -F ' ' {if ($1 > xmin && $1 < xmin && $2 > ymin && $2 < ymin) print $1 $2} $infile > $outfile
这可能会执行得很好。然而,正如标题所示,我们间接为 25 个区域保存此行,每个区域都有自己的 xmin、xmax 等。之后还有更多操作(使用 gmt 调用等)。 这是一个小片段:
xmin=-13000
xmax=13000
ymin=-500
ymax=500
infile=./full_file.txt
outfile=./filtered_file.yxy
srcfile=./region_1.txt
echo """awk -v xmin=$xmin -v xmax=$xmax -v ymin=$ymin -v ymax=$ymax -F ' ' {if ($1 > $xmin && $1 < $xmin && $2 > $ymin && $2 < $ymin) print $1 $2} $infile > $outfile""" >> $srcfile
显然,由于变量扩展,这会在运行时引发错误。我尝试转义 awk 列标识符,但无济于事或没有正确理解模式。 有人能给我指出一个允许我们保留间接方法的解决方案吗?
提前非常感谢
IIUC,你必须像这样转义每个美元符号:
{if (\$1 > \$xmin ...
或暂时关闭双引号并在单引号中放置美元符号 引用:
{if ("'$1'" > "'$'"xmin ...
或使用 Bash 特定的
%q
printf 说明符:
$ read
echo """awk -v xmin=$xmin -v xmax=$xmax -v ymin=$ymin -v ymax=$ymax -F ' ' {if ($1 > $xmin && $1 < $xmin && $2 > $ymin && $2 < $ymin) print $1 $2} $infile > $outfile""" >> $srcfile
$ printf "%q\n" "$REPLY"
echo\ \"\"\"awk\ -v\ xmin=\$xmin\ -v\ xmax=\$xmax\ -v\ ymin=\$ymin\ -v\ ymax=\$ymax\ -F\ \'\ \'\ \{if\ \(\$1\ \>\ \$xmin\ \&\&\ \$1\ \<\ \$xmin\ \&\&\ \$2\ \>\ \$ymin\ \&\&\ \$2\ \<\ \$ymin\)\ print\ \$1\ \$2\}\ \$infile\ \>\ \$outfile\"\"\"\ \>\>\ \$srcfile