Мне нужно извлечь широту и долготу из текстового файла 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.
Как его решить?
У вас есть две основные проблемы. Во-первых, вы используете 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
Проблема с синтаксисом, вам нужно endif для вашего, если if($1! = "") then + это утверждение должно быть if ($1 != "") then.
У вас есть две основные проблемы. Во-первых, вы используете 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
Проблема с синтаксисом, вам нужно endif для вашего, если if($1! = "") then + это утверждение должно быть if ($1 != "") then.