Проблема в команде 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

4 ответа

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

Теперь причина, по которой это не работает, - это синтаксическая ошибка. Вам нужно !=, а не ! =. Строго говоря, вам также понадобится endif, но скрипт будет работать без него, так как никаких операций за пределами блока if нет. Это сломается, если вы попытаетесь сделать что-нибудь еще, так что вы действительно должны это иметь.

Кроме того, ваш скрипт будет разбит, если вы попытаетесь запустить его в файле, чье имя содержит пробелы, потому что Csh-программирование считается вредным . Имея это в виду, вот рабочая версия вашего скрипта:

#!/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
ответ дан 18 July 2018 в 06:17

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

2
ответ дан 18 July 2018 в 06:17

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

Теперь причина, по которой это не работает, - это синтаксическая ошибка. Вам нужно !=, а не ! =. Строго говоря, вам также понадобится endif, но скрипт будет работать без него, так как никаких операций за пределами блока if нет. Это сломается, если вы попытаетесь сделать что-нибудь еще, так что вы действительно должны это иметь.

Кроме того, ваш скрипт будет разбит, если вы попытаетесь запустить его в файле, чье имя содержит пробелы, потому что Csh-программирование считается вредным . Имея это в виду, вот рабочая версия вашего скрипта:

#!/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
ответ дан 24 July 2018 в 18:34

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

2
ответ дан 24 July 2018 в 18:34

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

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