Проблема в команде awk

Я должен извлечь широту и долготу из текстового файла ASCII в Ubuntu, используя 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.

Как это решить?

2 ответа

Синтаксическая проблема, вам нужно endif для вашего, если if($1! = "") then + это если заявление должно быть if ($1 != "") then,

У вас есть две основные проблемы здесь. Во-первых, вы используете csh для сценариев. Это очень плохая идея. Я предлагаю вам прочитать большое эссе Тома Кристиансена " Программирование Csh считается вредным", чтобы понять, почему этого следует избегать. Csh хорош в качестве оболочки, но на самом деле не должен использоваться для сценариев.

Причина, по которой это не работает, заключается в синтаксической ошибке. Тебе нужно != и не ! =, Строго говоря, вам также нужен 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
Другие вопросы по тегам