запутался в скриптах awk

запутался в скриптах awk

В инструкциях указано, что ваш файл скрипта будет протестирован на нашей системе с помощью следующей команды:

awk -f ./awk4.awk input.csv

Напишите скрипт awk, который примет следующий файл и выведет поля имени и оценки

задание 1

судя по всему, я создал скрипт 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выполняется.

В твоем случае:

  1. /./это регулярное выражение, которое сопоставляет строки с любым символом... то есть все, кроме пустых строк - это в значительной степени избыточно, как условие

  2. Вы используете " "в качестве разделителя между переменными, используйте ,для применения значения по умолчанию

  3. Вам необходимо будет указать using ,в качестве разделителя в скрипте в начальном BEGINблоке.


BEGIN {FS=","}
{print $1,$2}

Если вы также хотите использовать запятую в качестве разделителя выходных данных, используйте:

BEGIN {FS=OFS=","}
{print $1,$2}

решение3

Скрипт awk — это просто набор команд awk, которые могут быть запущены с помощью awk. Существует два способа написания скрипта awk:

  1. Просто напишите команды 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.

  2. Напишите команды, но используйте 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-скрипт.

Связанный контент