Mova as linhas 2 3 após a linha 5 usando awk

1

Eu tenho conteúdo de arquivo como:

this line 1 no un1x
this lines 22 0
butbutbut this 33 22 has unix
but not 1
THIS is not
butbutbut ffff
second line
awk 'NR==2 && NR==3 {f=$0;next}  NR ==5 &&f{print;print f}' awk.write

O problema aqui é que em f eu só posso salvar o valor de nr==3 Eu quero mover as linhas 2 e 3 depois da linha 5.

    
por asadz 08.01.2016 / 09:37

4 respostas

3

Um caminho:

awk 'NR==2 || NR==3{a[i++]=$0;next}1;NR==5{for(j=0;j<2;j++){print a[j];}}' file
    
por 08.01.2016 / 09:49
3

Tente:

$ awk '
  FNR == 2 { l2 = $0; next } # Save 2nd line
  FNR == 3 { l3 = $0; next } # Save 3rd line
  FNR == 5 {                 # Print 5th line, follow 2nd, 3rd
    print
    print l2
    print l3
    next
  }
  1                          # Print other lines
' <file

Observe que, se você perder a segunda e a terceira linha, o arquivo terá menos de cinco linhas.

    
por 08.01.2016 / 09:47
3
awk 'NR == 2 || NR == 3 {l = l RS $0; next}
     NR == 5 {$0 = $0 l}
     {print}'
    
por 08.01.2016 / 11:23
2

Você precisa de várias variáveis ou uma matriz. Com awk :

awk 'NR==2||NR==3{a[i++]=$0;next} NR==5{print;for(c=0;c<i;c++){print a[c]}next}1' file
  • NR==2||NR==3 se for linha 2 ou linha 3
    • a[i++]=$0;next preencha a matriz a e continue.
  • NR==5 se for linha 5
    • print primeiro imprime a linha.
    • for(c=0;c<i;c++){print a[c]} percorre o array e imprime seu conteúdo.
  • 1 é uma condição verdadeira para imprimir cada linha.
por 08.01.2016 / 09:45