Eu tenho este arquivo:
a
b
c
d
e
f
Eu quero que a última linha seja copiada antes da primeira linha, então obterei o seguinte resultado:
f
a
b
c
d
e
f
Como posso fazer isso em sed
ou awk
?
Eu tenho este arquivo:
a
b
c
d
e
f
Eu quero que a última linha seja copiada antes da primeira linha, então obterei o seguinte resultado:
f
a
b
c
d
e
f
Como posso fazer isso em sed
ou awk
?
Com
ed
:O
t
comando emed
transfere/copia uma linha da linha endereçada (aqui$
para a última linha) para depois da linha endereçada por seu argumento (aqui0
, ou seja, insira antes da primeira linha). O,p
comando imprime o conteúdo do buffer de edição (altere paraw
para gravar o resultado de volta no arquivo).ou simplesmente assim, sem sed ou outro
Puro
sed
:Todas as linhas são coletadas no espaço de espera e anexadas à última linha:
H
acrescenta a linha atual ao espaço de espera. Infelizmente, isso iniciará o espaço de espera com uma nova linha, portanto,1h
para a primeira linha, o espaço de espera será substituído por essa linha sem preceder a nova linha$!d
significa que se esta não for (!
) a última linha ($
),d
eleja a linha, pois não queremos imprimi-la aindaG
só é executado para a última linha, pois para outras linhas od
processamento parou. Agora, todas as linhas (da primeira à última) que coletamos no espaço de espera são anexadas à linha atual (última) com oG
comando e tudo é impresso no final do script.Outra
sed
alternativa seria:exclua todas as linhas, exceto a última, a próxima leitura e a saída do arquivo inteiro.
GNU awk:
awk portátil:
Inverta o arquivo, lembre-se da primeira linha e imprima- a após a última linha , depois reverta o arquivo:
Tentei com o comando sed abaixo e funcionou bem também
comando
resultado
Tente isso,
tail -n1
irá imprimir a última linha do arquivoxargs -I
passará a saída da cauda para o sedsed '1i
irá inserir o contexto na primeira linhase a saída parecer arquivo, adicione
-i
a opção sed para fazer edição inline