Eu tenho um arquivo txt como este
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCC
DDDDDDDDDDD
EEEEEEEEEEE
FFFFFFFFFFF
GGGGGGGGGGG
HHHHHHHHHHH
IIIIIIIIIII
grupos de 3 linhas com uma alimentação de linha entre eles.
Quero inverter as duas primeiras linhas de cada grupo, deixando o arquivo assim
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC
EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF
HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII
como faço isso no terminal?
EDIT: carreguei uma amostra do meu arquivo de texto aqui, se você precisar testar sua resposta.
Uma maneira - com GNU awk:
Como é um formato fixo, use o operador módulo de acordo
e uma
perl
versão regex para diversão-00
modo de parágrafo, semelhante ao do awk-v RS=
(\N+\n)((?1))
- útil se regex complicado precisar ser repetidoExplicaçã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
evar_2
. Cada linha de entrada vai para o espaço do padrão, mas você pode copiar (ela substitui todo o conteúdo do espaço de retenção) ou anexá-la ao espaço de retenção. Desta forma:h
- copia o espaço do padrão para o espaço de espera. Agora, tanto o padrão quanto os espaços de retenção são:AAAAA
.n
- obtém a próxima linha de entrada no espaço padrão. Assim, o espaço padrão agora é:BBBBB
.G
- acrescenta uma nova linha e o conteúdo do espaço de retenção (AAAAA
) ao espaço do padrão, de modo que o espaço do padrão seja agoraBBBBB\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 padrão, se existir e sai do contrário (se o final do arquivo foi alcançado).p
- imprime o espaço do padrão novamente.Resultado