Я должен извлечь широту и долготу от текстового 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 считается вредным» , чтобы понять, почему этого следует избегать. 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
Синтаксическая проблема, вам нужно endif
для вашего if if($1! = "") then
+ это если утверждение должно быть if ($1 != "") then
.