Separando comandos em um arquivo de script?

0

Eu tenho uma atribuição executando uma série de comandos (n) awk em um arquivo de script. A chave deste arquivo de script é filtrar certas linhas e registros desse arquivo de texto original aqui, chamado estudantes :

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

Eu tenho esses comandos awk no meu arquivo de script testscript.script .

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

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

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

A partir de agora, quando eu executar nawk -f testscript.script students

Para as primeiras linhas da saída, obtenho:

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

Onde, como você pode ver, o segundo comando infundiu o primeiro, em vez de ser separado conforme desejado.

O que leva à minha pergunta: Como posso separar comandos em um shell script, de forma que cada novo comando tenha uma saída separada e independente de outros?

    
por KMoy 17.10.2016 / 05:28

2 respostas

1

Talvez seja melhor escrever um script de shell (digamos foo.sh ) com três comandos awk em vez de um único script awk com três blocos:

#!/bin/sh

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

Então, o seguinte deve dar o resultado desejado:

sh foo.sh students

(Você também pode fazer chmod +x foo.sh e depois executar ./foo.sh students .)

    
por muru 17.10.2016 / 05:56
2

Está funcionando perfeitamente e com expectativa.

Seu comando pode ser reescrito simplesmente como:

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

é composto por 3% expressõesawk:

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

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

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

Todas as três expressões serão aplicadas a todos os registros.

  • O primeiro deles está reorganizando os campos de acordo

  • O segundo é a correspondência se um registro terminar em A ( /A$/ ), em caso afirmativo, o primeiro e o segundo campos serão impressos

  • O terceiro é a correspondência se um registro terminar em !A , em caso afirmativo, o primeiro e o segundo serão impressos

  • Como os dois primeiros registros não satisfazem a condição da expressão 2, os campos são impressos de acordo com a expressão 1. O mesmo vale para o número de registro 4 e 5

  • Registre apenas 3 e 6 condição de correspondência da segunda expressão, ou seja, termina em A , portanto, a ação dessa condição, ou seja, imprimir os dois primeiros campos após a execução da expressão 1, ou seja, imprimir os campos reorganizados. Então, duas ações estão sendo aplicadas para o registro 3 e 6. Eu acho que isso é o que te enganou.

  • Nenhum dos registros corresponde à condição da expressão 3, ou seja, termina em !A , talvez você queira usar a condição como !/A$/ , ou seja, registros que não terminam em A (e aplicam a ação desejada) .

por heemayl 17.10.2016 / 05:57