Проблема в команде 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
задан 24 September 2017 в 17:56

2 ответа

У вас есть две главные проблемы здесь. Во-первых, вы используете 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
2
ответ дан 2 December 2019 в 02:14

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

2
ответ дан 2 December 2019 в 02:14

Другие вопросы по тегам:

Похожие вопросы: