Argumentos negativos para cabeça / cauda

7

Variantes desta questão certamente foram feitas várias vezes em lugares diferentes, mas estou tentando remover as últimas M linhas de um arquivo sem sorte.

A segunda resposta mais votada em esta questão recomenda fazer o seguinte para se livrar da última linha em um arquivo:

head -n -1 foo.txt > temp.txt

No entanto, quando tento isso no OSX & Zsh, eu recebo:

head: illegal line count -- -1

Por que isso? Como posso remover as linhas M últimas e as primeiras N linhas de um determinado arquivo?

    
por Amelio Vazquez-Reina 20.11.2014 / 18:17

3 respostas

14

Você pode remover as primeiras 12 linhas com:

tail -n +13

(Isso significa imprimir a partir da linha 13).

Algumas implementações de head como o GNU head support:

head -n -12

mas isso não é padrão.

tail -r file | tail -n +12 | tail -r

funcionaria nos sistemas que possuem tail -r (veja também GNU tac ), mas é sub-ótimo.

Onde n é 1:

sed '$d' file

Você também pode fazer:

sed '$d' file | sed '$d'

para remover 2 linhas, mas isso não é o ideal.

Você pode fazer:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

Mas cuidado, pois isso não funcionará com grandes valores de n com algumas sed implementações.

com awk :

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

Para remover m linhas do início e n do final:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'
    
por 20.11.2014 / 18:27
2

Você pode usar o seguinte modo para remover as primeiras N linhas e as últimas M linhas.

Com N=5 , M=7 e arquivo test.txt :

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

O comando imprime todas as linhas de N + 1 a LastLine-M.

Outra opção é usar python:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt
    
por 20.11.2014 / 18:45
1

Você pode remover as últimas linhas M (aqui M = 100) de um arquivo com:

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
    
por 29.11.2018 / 09:15