Oposto da cauda: todas as linhas, exceto as últimas n linhas

26

Como posso descartar as últimas n linhas de um arquivo com um filtro de linha de comando unix?

Isso seria o oposto de tail : tail descarta as primeiras n linhas, mas canaliza o restante, mas eu quero que o comando canalize tudo através de exceto as últimas n linhas .

Infelizmente não encontrei nada parecido - head também não ajuda. EDITAR : Pelo menos no Solaris ele não aceita argumentos negativos.

    
por Hans-Peter Störr 30.01.2013 / 14:30

4 respostas

31

Se você tem o GNU head , você pode usar

head -n -5 file.txt

para imprimir todas as últimas cinco linhas de file.txt .

Se head -n não receber argumentos negativos, tente

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
    
por 30.01.2013 / 14:43
5

Aqui está uma maneira simples de excluir a última linha, que funciona no BSD, etc.

sed '$d' input.txt

A expressão lê "na última linha, apague-a". As outras linhas serão impressas, pois é o comportamento padrão de sed .

Você poderia encadear juntos para remover várias linhas

sed '$d' input.txt | sed '$d' | sed '$d'

O que é um pouco pesado, reconhecidamente, mas faz apenas uma varredura através do arquivo.

Você também pode dar uma olhada nisto, para obter mais respostas: link

Aqui está um verso adaptado de um dos meus favoritos:

N=10
sed -n -e ':a' -e "1,$N!{P;N;D;};N;ba"

Eu me diverti decifrando aquele, e espero que você também o faça (: Ele armazena em buffer N linhas à medida que varre, mas por outro lado é bastante eficiente.

    
por 10.06.2015 / 17:58
4
head file.txt               # first 10 lines
tail file.txt               # last 10 lines
head -n 20 file.txt         # first 20 lines
tail -n 20 file.txt         # last 20 lines
head -20 file.txt           # first 20 lines
tail -20 file.txt           # last 20 lines
head -n -5 file.txt         # all lines except the 5 last
tail -n +5 file.txt         # all lines except the 4 first, starts at line 5
    
por 12.09.2016 / 10:52
2

Estou curioso porque você acha que head não é uma opção:

~$ man head
...
-n, --lines=[-]K
        print the first K lines instead of the first 10; 
        with the leading '-', print all but the last K lines of each file

Isso parece se encaixar no seu propósito, usando, por exemplo:

head -n -20 yourfile.txt
    
por 30.01.2013 / 14:45