Como mover a última linha em um arquivo? [duplicado]

1

Exemplo de um arquivo

line 1
line 2
line 3
line 4

line 4 deve ser depois de line 1

line 1
line 4
line 2
line 3

Importante: pode ter mais de quatro linhas, de alguma forma, o script precisa entender que precisa ler a última linha, não , linha 4.

    
por John Doe 08.09.2018 / 08:12

2 respostas

1

Uma versão alternativa, mais lenta e mais longa.

#!/bin/sh

if [ ! -f "$1" ]
then
    printf "No input file\n"
    exit
fi

FIRST='head -n 1 "${1}"'
LAST='tail -n 1 "${1}"'
MID='sed -n '$d; 2,$p' "${1}"'
printf "${FIRST}\n${LAST}\n${MID}\n"

exit

Mais lento porque usa head , tail e sed para acessar o arquivo a cada vez. Em um arquivo grande (ou muitos arquivos) isso pode ser muito perceptível.

    
por 08.09.2018 / 10:23
1
$ printf '4m1\n,p\n' | ed -s file
line 1
line 4
line 2
line 3

O script ed curto

4m1
,p

moverá a linha quatro para a linha um e depois exibirá o conteúdo do buffer de edição no terminal.

Para salvar o resultado em um novo arquivo, você pode usar um redirecionamento como

printf '4m1\n,p\n' | ed -s file >newfile

ou você pode dizer a ed para salvar o arquivo com

printf '4m1\nw newfile\n' | ed -s file

O comando w newfile salvaria o buffer editado no arquivo nomeado. O comando w sem nome de arquivo salvaria o arquivo no nome original.

Como o editor de linha ed lê o arquivo na memória, não há problema em usá-lo para esse tipo de coisa se o arquivo for de tamanho razoável, mas não muito grande (menor que gigabytes).

Para mover a última linha, altere 4 para $ nos comandos acima.

    
por 08.09.2018 / 10:02