awk 命令中的问题

awk 命令中的问题

我必须使用命令从 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

相关内容