Что-то не так при компиляции - PullRequest
0 голосов
/ 12 января 2019

Что я не так, пожалуйста? У меня есть код в файле

file.awk:

BEGIN { CONVFMT="%0.17f" }
/D Format/ { in_f_format=0; next }
/F Format/ { in_f_format=1; next }
in_f_format != 1 { next }
!($1 ~ /^[1-9]/) { next }
$1 == 11 { prt(180,3.141592653589); next }
$1 == 15 { prt(100,1); next }
$1 == 20 { prt(10,1); next }
$1 == 26 { next }
{ prt(1,1) }

function prt(mult, div) {
print trunc($5 * mult / div) ORS trunc($6 * mult / div)
}

function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}

Я пишу:

chmod +x file.awk 
./file.awk

в терминал, и я получаю эти ошибки:

./file.awk: řádek 1: BEGIN: příkaz nenalezen
./file.awk: řádek 2: /D: Adresář nebo soubor neexistuje
./file.awk: řádek 2: next: příkaz nenalezen
./file.awk: řádek 3: /F: Adresář nebo soubor neexistuje
./file.awk: řádek 3: next: příkaz nenalezen
./file.awk: řádek 4: in_f_format: příkaz nenalezen
./file.awk: řádek 5: chyba syntaxe poblíž neočekávaného tokenu „{“
./file.awk: řádek 5: `!($1 ~ /^[1-9]/) { next }'

Где ошибка, пожалуйста?

EDIT Аналогично скрипт

BEGIN { CONVFMT="%0.17f" }
/D Format/ { in_f_format=0; next }
/F Format/ { in_f_format=1; next }
in_f_format != 1 { next }
!($1 ~ /^[1-9]/) { next }
$1 == 35 { print t($5), t($6) }

function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}

выдает ошибку:

fatal: function `t' not defined

Я хотел бы написать с этого ввода

                      Input-Output in F Format

No.  Curve    Input Param.        Correction     Output Param.    Standard Deviation
26      0  56850.9056460000     -0.0017608883  56850.9038851117      0.0016647171
35      1      0.2277000000      0.0011369754      0.2288369754      0.0014780395
35      2      0.2294000000      0.0000417158      0.2294417158      0.0008601513
35      3      0.2277000000      0.0007425066      0.2284425066      0.0022555311
35      4      0.2298000000     -0.0000518690      0.2297481310      0.0010186846
35      5      0.2295000000      0.0000793572      0.2295793572      0.0014667137
35      6      0.2300000000      0.0000752449      0.2300752449      0.0006258864
35      7      0.2307000000     -0.0001442591      0.2305557409      0.0002837569
35      8      0.2275000000      0.0007358355      0.2282358355      0.0007609550
35      9      0.2292000000      0.0003447650      0.2295447650      0.0007148005
35     10      0.2302000000     -0.0001854710      0.2300145290      0.0006320668
35     11      0.2308000000     -0.0002064324      0.2305935676      0.0008911070
35     12      0.2299000000     -0.0000202967      0.2298797033      0.0002328860
35     13      0.2298000000      0.0000464629      0.2298464629      0.0011609539
35     14      0.2307000000     -0.0003654521      0.2303345479      0.0006827961
35     15      0.2294000000      0.0002157908      0.2296157908      0.0003253584


                      Input-Output in D Format

числа в $ 5 и $ 6 в строках, начинающихся с 35.

РЕДАКТИРОВАТЬ 2 Я отредактировал положение функции f как

BEGIN { CONVFMT="%0.17f" }
function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}
/D Format/ { in_f_format=0; next }
/F Format/ { in_f_format=1; next }
in_f_format != 1 { next }
!($1 ~ /^[1-9]/) { next }
$1 == 35 { print t($5), t($6) }

Ответы [ 3 ]

0 голосов
/ 12 января 2019

ОБНОВЛЕНИЕ: После разговора с OP (о котором я тоже упоминал в своих комментариях) OP должен изменить имя функции на фактическую функцию с t, и тогда это сработало. Мысль обновить здесь, чтобы все знали.



Возможны 2 варианта решения.

1-й: Упомяните awk в шеллскрипте и запустите его как скрипт оболочки.

cat script.ksh
awk 'BEGIN { CONVFMT="%0.17f" }
/D Format/ { in_f_format=0; next }
/F Format/ { in_f_format=1; next }
in_f_format != 1 { next }
!($1 ~ /^[1-9]/) { next }
$1 == 11 { prt(180,3.141592653589); next }
$1 == 15 { prt(100,1); next }
$1 == 20 { prt(10,1); next }
$1 == 26 { next }
{ prt(1,1) }

function prt(mult, div) {
print trunc($5 * mult / div) ORS trunc($6 * mult / div)
}

function trunc(n, s) {
s=index(n,".")
return (s ? substr(n,1,s+6) : n)
}' Input_file

Дайте script.ksh надлежащие разрешения на выполнение и запустите его, как будто вы работаете.

2nd: Запустите его как awk скрипт, запустив его как:

awk -f awk_file Input_file
0 голосов
/ 12 января 2019

Без строки shebang оболочка считает, что ваш скрипт является скриптом оболочки. Чтобы сделать его исполняемым в виде сценария awk , вы должны использовать правильную строку shebang:

cat <<'EOF' > awkscript
#!/usr/bin/awk -f

BEGIN { print "Hello, world!" }
EOF
chmod +x awkscript

где /usr/bin/awk - путь к вашему исполняемому файлу awk (можно найти с помощью type awk). Важным битом является флаг -f.

Теперь вы можете запустить его как отдельный скрипт:

$ ./awkscript 
Hello, world!
0 голосов
/ 12 января 2019

Канонический (не уверен, что это правильное слово) способ использовать его так:

awk -f file.awk datafile

или путь трубы так:

cat datafile | awk -f file.awk

file.awk, который совпадает с вашими попытками, является файлом сценария awk (имя может измениться).
И datafile - это файл (ы), содержащий данные, с которыми вы хотите иметь дело.

И нет необходимости использовать chmod awk file (s) для его использования.

Обновление:
Но спасибо, любезно упомянутое в комментарии, вы тоже можете сделать это.
Поставьте эту строку:

#/usr/bin/awk -f

в начале вашего file.awk. (Учитывая, что ваш исполняемый файл awk находится в этом месте).
После chmod +x file.awk вы можете выполнить его так:

./file.awk datafile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...