Coloque nova linha após cada comando

4

Como faço para implementar um retorno de carro ou nova linha em cada comando awk em um script de shell, de forma que a saída de cada comando seja separada da próxima?

Talvez eu precise de mais especificações. Eu tenho dois comandos awk, listados abaixo:

awk {print , } , comando awk 1, saídas:

John Bender
Bohn Jender
Jen Bondher

awk '{print , }' , comando 2, saídas:

AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543

Quando combinados em um script de shell e executados com ./<testscript>.sh <textfile> , a linha de comando, obviamente, é exibida:

John Bender
Bohn Jender
Jen Bondher
AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543

Como quero que a nova linha anexe o comando PER awk, quero que a saída seja semelhante a:

John Bender
Bohn Jender
Jen Bondher

AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543

Tentativas anteriores de anexar "\ n" resultaram em:

John Bender

Bohn Jender

Jen Bondher

AGE 21

AGE 420

AGE 2345678909876543234567890876543234567890876543

.. o que é certamente indesejado.

    
por KMoy 17.10.2016 / 06:52

2 respostas

7

Como você está executando dentro de um script de shell, basta adicionar echo após cada comando awk , ou seja, entre os comandos que você deseja obter saídas separadas. echo adiciona uma nova linha. Por exemplo:

awk '{print  }' file.txt
echo
awk '{print , }' file.txt

Resposta original:

Anexe printf "\n" no final de cada awk action {} .

printf "\n" imprimirá uma nova linha.

Exemplo:

% awk '{print ; printf "\n"}' <<<$'foo bar\nspam egg'
foo

spam
por heemayl 17.10.2016 / 06:55
2

Só porque é possível fazê-lo, eis que abordagens alternativas podem ser tomadas.

ARGIND com variáveis NR e FNR

Essa abordagem é executada por meio do arquivo duas vezes e, no momento da execução do segundo arquivo, ele imprime uma nova linha, que é obtida por meio de algumas ideias interessantes.

  • Para processar o mesmo arquivo, mas extrair informações diferentes, o arquivo é fornecido na linha de comando duas vezes.

  • Como distinguimos quando estamos executando o primeiro arquivo (para extrair os campos $ 1 e $ 2) e quando através do segundo? Via usando a variável ARGIND .

  • NR é o registro total processado até o momento e FNR é o registro total processado no arquivo atual. Com o primeiro arquivo, eles são os mesmos. Quando eles diferem? Quando chegamos ao segundo arquivo. Neste momento, precisamos imprimir a nova linha, mas de alguma forma evitar que ela seja impressa para outros valores onde NR > FNR . Nós levantamos um sinalizador (via variável flag).

Exemplo de saída:

$ awk '!flag && NR>FNR {print "";flag=1} ARGIND==1{print ,}ARGIND==2{print ,}' data.txt data.txt                  
John Bender
Bohn Jender
Jen Bondher

AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543

Uso da cláusula END

Como mencionado nos comentários da resposta do heemayls, ao usar dois comandos awk separados, pode-se usar END block para imprimir algo assim que o processamento do arquivo estiver completo

$ awk '{print ,}END{print "\n"}' data.txt;  awk '{print ,}' data.txt                                                          
John Bender
Bohn Jender
Jen Bondher


AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543

Variação no bloco END com matrizes associativas

Como seu bloco de $ 3 é basicamente a mesma coisa repetidamente (string "AGE") você não precisa armazená-lo, mas você pode armazenar $ 4 em array associativo. Em seguida, no bloco END, você pode iterar os valores armazenados depois de imprimir a nova linha.

$ awk '{print ,;age[i++]=}END{print"";for(var in age) print "AGE",age[var]}' data.txt                                           
John Bender
Bohn Jender
Jen Bondher

AGE 21
AGE 420
AGE 2345678909876543234567890876543234567890876543
    
por Sergiy Kolodyazhnyy 18.10.2016 / 06:34