В инструкциях указано, что ваш файл скрипта будет протестирован на нашей системе с помощью следующей команды:
awk -f ./awk4.awk input.csv
Напишите скрипт awk, который примет следующий файл и выведет поля имени и оценки
судя по всему, я создал скрипт bash, и это должен быть скрипт awk, который будет запускаться с помощью awk -f из командной строки. Ниже приведен мой код. Есть ли простой способ преобразовать мои скрипты bash в скрипты awk, не переделывая все заново? Совсем запутался в инструкциях.
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' $1
решение1
В скрипте awk содержимое — это то, что вы бы предоставили awk
в качестве команд. Так что в этом случае это:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Однако это затруднит использование, -F ,
поэтому лучше установить его FS
в BEGIN
блоке.
Итак, ваш сценарий будет таким:
#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
решение2
Вы написали awk
сценарий, но поместили его в сценарий. Это ваш awk
сценарий:
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}
Сохраните его в файл script.awk
и запустите как
awk -F',' -f script.awk inputfile
Теперь несколько советов по вашему сценарию:
awk
Команды выглядят как CONDITION {COMMAND(S)}
. Если CONDITION
выполняется для строки (записи), {COMMAND(S)}
выполняется. Если нет CONDITION
, {COMMAND(S)}
выполняется для всех записей, если нет, {COMMAND(S)}
то запись просто печатается всякий раз, когда CONDITION
выполняется.
В твоем случае:
/./
это регулярное выражение, которое сопоставляет строки с любым символом... то есть все, кроме пустых строк - это в значительной степени избыточно, как условиеВы используете
" "
в качестве разделителя между переменными, используйте,
для применения значения по умолчаниюВам необходимо будет указать using
,
в качестве разделителя в скрипте в начальномBEGIN
блоке.
BEGIN {FS=","}
{print $1,$2}
Если вы также хотите использовать запятую в качестве разделителя выходных данных, используйте:
BEGIN {FS=OFS=","}
{print $1,$2}
решение3
Скрипт awk — это просто набор команд awk, которые могут быть запущены с помощью awk
. Существует два способа написания скрипта awk:
Просто напишите команды awk в текстовом файле и вызовите с помощью
awk -f /path/to/file.awk
. В вашем случае это будет:/./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
И вы бы запустили его как:
awk -F, -f /path/to/file.awk inputFile
Или, если вам нужно, чтобы он запускался только с
awk -f ./path/to/file.awk inputFile
, без ,-F,
то установите разделитель полей в самом скрипте:BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
А затем запустить с
awk -f /path/to/file.awk inputFile
.Напишите команды, но используйте shebang, чтобы указать, какой интерпретатор должен читать скрипт. В вашем случае это будет выглядеть так:
#!/usr/bin/awk -f ## With this approach, you can't use -F so you need to set ## the field separator in a BEGIN{} block. BEGIN{ FS=","} /./ { ##comment print the name and grade, which is first two fields print $1" "$2 }
Затем вы сделаете скрипт исполняемым (
chmod a+x /path/to/file.awk
) и запустите его следующим образом:/path/to/file.awk inputFile
Это оба скрипта awk. Третий вариант — написатьоболочкаscript вместо этого и заставить shell-скрипт запустить awk. Это будет выглядеть так:
#!/bin/sh
awk -F, '
/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}' "$1"
У вас было ни то, ни другое: вы использовали awk-шебанг, но вместо awk-скрипта у вас был shell-скрипт.