У меня есть скрипт с двумя кодами для извлечения суммы данных данного файла и печати в другой файл, а второй извлекает общее количество отсутствующих точек данных в другой файл. Наконец, два выходных файла помещаются вместе в третий файл. Все три кода работают в одиночку. Из-за большого количества файлов, необходимых для этого, я пытался автоматизировать в одном файле сценария. Запуск оболочки bash. Файл Coavg.sh имеет права на выполнение. Когда я пытаюсь запустить это как один скрипт, я получаю следующую ошибку:

awk: cmd. line:1: ./Colavg.sh
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: ./Colavg.sh
awk: cmd. line:1:   ^ unterminated regexp
#!/bin/awk

awk -F ',' 'NF==4{count++} END {print "missing: "count}' County029-CO-0023-T0000JD.out > avg.out;
awk -F ',' '$4==-999{c999++}; END{print "missing: "c999}' County029-CO-0023-T0000JD.out > avg1.out;
cat avg1.out avg.out >> County029-CO-0023-T0000JD-avg.out
0
ilkkachu 25 Мар 2021 в 18:57
5
У вас есть скрипт оболочки, который использует awk, а не сценарий awk — измените shebang на соответствующий интерпретатор оболочки, такой как #!/bin/sh или #!/bin/bash
 – 
steeldriver
22 Мар 2021 в 16:20

1 ответ

Проблема в строке #! вашего скрипта. Он должен читаться как #!/bin/sh, поскольку это сценарий оболочки, а не сценарий awk.

На самом деле здесь происходит то, что оболочка с вашей ошибочной строкой #! будет выполняться

/bin/awk ./Colavg.sh

Это означает использование текстовой строки ./Colavg.sh в качестве программы awk. Для программы awk это не имеет смысла, и ваш интерпретатор awk идентифицирует две отдельные ошибки, прежде чем принять решение об отказе.


Скрипт можно упростить:

#!/bin/sh

name=County029-CO-0023-T0000JD

awk -F , '
    $4 == -999 { c999++  }
    NF == 4    { count++ } 
    END { printf "missing: %d\n", c999  }
    END { printf "missing: %d\n", count }' "$name.out" >>"$name-avg.out"

Измените >> в конце на >, если вы хотите, чтобы выходной файл был усечен (очищен) перед записью в него результатов.

2
Kusalananda 25 Мар 2021 в 17:28