我必须使用命令从 Ubuntu 中的 ASCII 文本文件中提取纬度和经度awk
。我编写了以下代码并将其保存在untitled.sh
:
#!/bin/csh -f
set file = $1
if($1! = "") then
awk'{ \
if(NR == 1) NCOLS = $2; \
if(NR == 2) NROWS = $2; \
if(NR == 3) LL_LNG = $2; \
if(NR == 4) LL_LAT = $2; \
if(NR == 5) CELLSIZE = $2; \
if(NR == 6) NODATA = $2; \
if(NR > 6) { \
for(i = 1; i <= NF; i++ ) { \
if( $i!= NODATA ) { \
printf( "%f %f %f\n", LL_LNG + (i-1) * CELLSIZE + CELLSIZE / 2, LL_LAT + (NROWS-(NR-7)) * CELLSIZE - CELLSIZE / 2, $i ) \
#printf( "%f %f %f\n" LL_LNG + (i-1) * CELLSIZE, LL_LAT + (NROWS-(NR-7)) * CELLSIZE, $i ) \
} \
} \
} \
} '$file
之后我用csh untitled.sh
或运行它csh csh.sh test.txt
,但它告诉我们:
if: Expression Syntax.
如何解决?
答案1
语法问题,你需要endif
的 if if($1! = "") then
+ this if 语句应该是if ($1 != "") then
。
答案2
你有两个主要问题。首先,你使用 csh 编写脚本。这是一个非常糟糕的想法。我建议你读一下 Tom Christiansen 的精彩文章Csh 编程被认为有害了解为什么应该避免这种情况。Csh 作为 shell 还不错,但实际上不应该用于编写脚本。
现在,这不起作用的原因是语法错误。您需要!=
and 而不是! =
。严格来说,您还需要一个,endif
但是脚本在没有它的情况下也可以工作,因为块外没有操作if
。但是如果您尝试执行其他任何操作,它就会中断,所以您确实应该拥有它。
另外,如果你尝试在名称包含空格的文件上运行脚本,脚本将会中断,因为你没有引用你的变量考虑到所有这些,下面是您的脚本的工作版本:
#!/bin/csh -f
set file = "$1"
if("$file" != "") then
awk '{ \
if(NR == 1) NCOLS = $2; \
if(NR == 2) NROWS = $2; \
if(NR == 3) LL_LNG = $2; \
if(NR == 4) LL_LAT = $2; \
if(NR == 5) CELLSIZE = $2; \
if(NR == 6) NODATA = $2; \
if(NR > 6) { \
for(i = 1; i <= NF; i++ ) { \
if( $i!= NODATA ) { \
printf( "%f %f %f\n", LL_LNG + (i-1) * CELLSIZE + CELLSIZE / 2, LL_LAT + (NROWS-(NR-7)) * CELLSIZE - CELLSIZE / 2, $i ) \
#printf( "%f %f %f\n" LL_LNG + (i-1) * CELLSIZE, LL_LAT + (NROWS-(NR-7)) * CELLSIZE, $i ) \
} \
} \
} \
} ' "$file"
endif
当然,如果这就是你想要做的一切,那么你可以让你的生活更轻松,直接使用awk
而不是摆弄csh
:
#!/usr/bin/awk -f
{
if(NR == 1) NCOLS = $2;
if(NR == 2) NROWS = $2;
if(NR == 3) LL_LNG = $2;
if(NR == 4) LL_LAT = $2;
if(NR == 5) CELLSIZE = $2;
if(NR == 6) NODATA = $2;
if(NR > 6) {
for(i = 1; i <= NF; i++ ) {
if( $i!= NODATA ) {
printf( "%f %f %f\n", LL_LNG + (i-1) * CELLSIZE + CELLSIZE / 2, LL_LAT + (NROWS-(NR-7)) * CELLSIZE - CELLSIZE / 2, $i )
}
}
}
}
将其另存为foo.awk
,使其可执行,然后在您的文件上运行它:
./foo.awk file