Invertendo duas linhas em um grupo de 3 repetições

1

Eu tenho um arquivo txt como este

AAAAAAAAAA
BBBBBBBBBB
CCCCCCCC

DDDDDDDDDDD
EEEEEEEEEEE
FFFFFFFFFFF

GGGGGGGGGGG
HHHHHHHHHHH
IIIIIIIIIII

grupos de 3 linhas com uma linha de alimentação entre.

Eu quero inverter as duas primeiras linhas de cada grupo, fazendo o arquivo assim

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

como faço isso no terminal?

EDIT: Eu fiz upload de uma amostra do meu arquivo de texto para aqui se você precisar testar sua resposta contra ele.

    
por SpaceDog 16.12.2017 / 16:22

3 respostas

2
$ cat -n ip.txt 
     1  AAAAAAAAAA
     2  BBBBBBBBBB
     3  CCCCCCCC
     4  
     5  DDDDDDDDDDD
     6  EEEEEEEEEEE
     7  FFFFFFFFFFF
     8  
     9  GGGGGGGGGGG
    10  HHHHHHHHHHH
    11  IIIIIIIIIII

Como é um formato fixo, use o operador de módulo de acordo

$ awk 'NR%4==1{s=$0; next} 1; NR%4==2{print s}' ip.txt
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII


e uma versão perl regex para diversão

perl -00 -pe 's/(\N+\n)(\N+\n)/$2$1/' ip.txt
  • -00 modo de parágrafo, semelhante ao -v RS= do awk
  • troque primeiro as duas linhas
    • também pode usar (\N+\n)((?1)) - útil se a regex complicada precisar ser repetida
por 16.12.2017 / 17:03
2

De uma maneira - com o GNU awk:

gawk 'BEGIN{RS=""; OFS=FS="\n"} {tmp = $2; $2 = $1; $1 = tmp; ORS=RT} 1' file
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
    
por 16.12.2017 / 16:40
2
sed -n 'h; n; G; N; p; n; p' input.txt

Explicação

O sed tem dois espaços operacionais - o espaço de espera e o espaço de padrão. Eles são como duas variáveis - var_1 e var_2 . Cada linha de entrada entra no espaço de padrão, mas você pode copiar (substitui todo o conteúdo do espaço de armazenamento) ou anexá-lo ao espaço de armazenamento. Assim:

  • h - copia o espaço do padrão para o espaço de armazenamento. Agora, os espaços padrão e de retenção são: AAAAA .
  • n - obtém a próxima linha de entrada no espaço padrão. Então, o espaço padrão é agora: BBBBB .
  • G - acrescenta uma nova linha e o conteúdo do espaço de espera ( AAAAA ) ao espaço padrão, de modo que o espaço padrão agora é BBBBB\nAAAAA .
  • N - acrescenta uma nova linha e a próxima linha de entrada ao espaço padrão - BBBBB\nAAAAA\nCCCCC
  • p - imprime o espaço do padrão.
  • n - obtém a próxima linha de entrada no espaço de padrão, se existir e sai de outra forma (se o final do arquivo foi atingido).
  • p - imprime o espaço padrão novamente.

Resultado

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
    
por 16.12.2017 / 22:11

Tags