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