Confusão de colchetes encaracolados! [fechadas]

0

Pergunta de colchetes encaracolados, com este conteúdo de arquivo.

one one one

two two two

three 098234

one one one

two two two

three 098234

one one one

two two two

three 098234 ...
awk '{ a[NR]=$0 } END {b=0; for (i=1;i<=NR;i++) { b++; printf "%s",a[i]; if(b==3) {print"";b=0;}}}' file

saída:

one one onetwo two twothree 098234

four four fourfive five fivesix 092834
 ...

Concatene 3 linhas e adicione uma nova linha!

A necessidade ou colocação de chaves, não é entendida corretamente, embora isso funcione. Haveria outras maneiras de usar chaves aqui, com o mesmo resultado? Eu olhei muitos exemplos semelhantes, não pude ter o resultado desejado.

Não tenho certeza se minha pergunta faz sentido, mas existe uma regra simples para o colchete. Obrigado

    
por Joe 25.03.2016 / 23:23

1 resposta

2

Sua declaração awk pode ser melhor compreendida com quebras de linha explícitas

awk '
         { a[NR]=$0 }    # Applies to every line of input

    END  {               # Executed once, when there is no more data
             b=0;
             for (i=1;i<=NR;i++) {
                 b++;
                 printf "%s",a[i];
                 if (b==3) {
                     print"";
                     b=0;
                 }
             }
         }
' file

Com base em sua exigência de concatenar todas as três linhas de dados, isso parece ser um código muito ineficiente à medida que lê todo o arquivo antes de fazer qualquer processamento.

Tente isso, que apenas armazena três linhas de cada vez:

awk '{s=s $0} NR>1&&!((NR)%3) {print s;s=""}' data

Expandido, parece com isso

awk '
                    { s=s $0 }           # Append this line to the buffer
    NR>1 && !(NR%3) { print s; s="" }    # Print the buffer every three lines
' data

A expressão na primeira linha (NR%3) atinge zero a cada terceira linha. O ! nega isso, portanto, ele só aciona o componente {...} a cada terceira linha.

    
por 25.03.2016 / 23:41

Tags