Разделение команд в файле сценария?

У меня есть назначение, выполняющее ряд (n) awk-команд в одном файле сценария. Ключ этого файла скрипта состоит в том, чтобы отфильтровать определенные строки и записи этого исходного текстового файла здесь, называемые students:

Frank       Smith       Engineering  Senior     C
John        Doe         Marketing    Junior     B
Nancy       Jones       Engineering  Junior     A
Betty       Anderson    Nursing      Sophomore  B   
Bob         Johnson     History      Freshman   B   
James       Smith       Economics    Senior     A

У меня есть эти awk-команды в моем файле сценария students [!d1 ].

{print $2, $1, $3, $4, $5}

/A$/ {print $1, $2} 

/!A$/ {print $1, $2}

На данный момент, когда я запускаю nawk -f testscript.script students

Для первых нескольких строк вывода я получаю:

Smith Frank Engineering Senior C
Doe John Marketing Junior B
Jones Nancy Engineering Junior A
Nancy Jones 
Anderson Betty Nursing Sophomore B
Johnson Bob History Freshman B
Smith James Economics Senior A
James Smith

Где, как вы видите, вторая команда вливается в первую, а не разделяется по желанию.

Что приводит к моему вопросу: как я могу отделить команды в сценарии оболочки, так что каждая новая команда имеет отдельный независимый вывод от других?

1
задан 17 October 2016 в 06:52

1 ответ

Он работает отлично и ожидаемо.

Ваша команда может быть переписана просто как:

awk '{print $2, $1, $3, $4, $5}; /A$/ {print $1, $2}; /!A$/ {print $1, $2}' students

она состоит из 3 awk выражений:

{print $2, $1, $3, $4, $5} /A$/ {print $1, $2} /!A$/ {print $1, $2}

Все три выражения будут применены ко всем записям.

Первый перестраивает поля соответственно. Второй соответствует, если запись заканчивается на A (/A$/), если это так, печатается первое и второе поля. Третье соответствует, если запись заканчивается на !A, если так печатаются первая и вторая. Как первые две записи не удовлетворяют условию выражения 2, поля печатаются в соответствии с выражением 1. То же самое относится к номеру записи 4 и 5 Только запись 3 и 6 соответствует условию 2-го выражения, т.е. заканчивается на A, поэтому действие этого условия, т.е. на напечатайте первые два поля, выполняемые сразу после выполнения выражения 1, т.е. для печати перестроенных полей. Таким образом, для записи 3 и 6 применяются два действия. Я думаю, что это то, что сработало. Ни одно из записей не соответствует условию выражения 3, то есть заканчивается на !A, возможно, вы хотели использовать это условие как !/A$/, то есть записи, которые не заканчиваются на A (и применяют желаемое действие).
2
ответ дан 23 May 2018 в 05:06
  • 1
    Спасибо! Тем не менее, используется точка с запятой и одна длинная строка кода - единственный способ разделить эти команды? Или есть способ, которым я могу разделить команды в коде (с каждой командой в новой строке)? Я спрашиваю об этом, потому что есть очень много команд, которые мне нужно будет внести в файл сценария оболочки, и я бы предпочел не объединять их таким образом. – KMoy 17 October 2016 в 07:04
  • 2
    @KMoy Обратите внимание, что ; s не являются строго необходимыми, это для удобства чтения. Также, если у вас много таких выражений, используйте способ, которым вы пользуетесь, используя скрипт awk. Мой ответ - прояснить ваши недоумения. – heemayl 17 October 2016 в 07:20

Другие вопросы по тегам:

Похожие вопросы: