Imprime o conteúdo do arquivo sem a primeira e a última linhas

45

Existe uma maneira simples de fazer eco de um arquivo, pulando a primeira e a última linha? Eu estava olhando para piping de head em tail , mas para aqueles parece que eu teria que saber o total de linhas desde o início. Eu também estava olhando para split , mas também não vejo uma maneira de fazer isso.

    
por user394 14.11.2012 / 23:18

5 respostas

90

Apenas com sed , sem nenhum canal:

sed '1d;$d' file.txt

OBSERVAÇÃO

  • 1 significa primeira linha
  • d mean delete
  • ; é o separador para 2 comandos
  • $ significa última linha
por 14.11.2012 / 23:24
30

Você não precisa saber o número de linhas com antecedência. tail e head podem receber um deslocamento do início ou do final do arquivo, respectivamente.

Esse canal começa na segunda linha do arquivo (pulando a primeira linha) e pára no último, mas um (pulando a linha final). Para pular mais de uma linha no início ou no final, ajuste os números de acordo.

tail -n +2 file.txt | head -n -1

fazendo o contrário, funciona da mesma forma, é claro:

head -n -1 file.txt | tail -n +2
    
por 14.11.2012 / 23:22
6

Veja como fazer isso com awk :

awk 'NR>2 {print t} {t=$0}'

Outra forma de sed :

sed '1d;x' file.txt

x é o comando sed avançado, ele alterna a linha atual com a anterior: a corrente vai para o buffer e a anterior vai para a tela e assim por diante, enquanto sed processa o fluxo linha por linha (é por isso primeira linha ficará em branco).

awk solution em cada etapa (linha) coloca a linha atual na variável e começa a imprimi-la somente depois que a segunda linha é passada. Assim, temos a sequência de linhas shitfed na tela do segundo para o último, mas um. A última linha é omitida porque a linha está na variável e deve ser impressa apenas na próxima etapa, mas todas as etapas já se esgotaram e nunca vemos a linha na tela.

Mesma ideia no perl :

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$. representa o número da linha e $_ da linha atual.% perl -n é o atalho para while(<..>) {..} structure e -e é para o script in-line.

    
por 18.11.2014 / 14:02
1

Se você quiser resolver este problema, usando apenas os comandos "head" e "tail", então a solução fornecida por Olaf Dietsche, para essa pergunta, funciona perfeitamente bem. Mas a opção head -n -1 não funciona no Mac.

Para usuários de Mac:

No Mac, a cabeça -n -1 não funciona. E eu estava tentando encontrar uma solução simples [sem se preocupar com tempo de processamento] para resolver esse problema usando apenas comandos "head" e / ou "tail".

Eu tentei a seguinte sequência de comandos e fiquei feliz por poder resolvê-lo usando apenas o comando "tail" [com as opções disponíveis no Mac]. Então, se você está no Mac, e quer usar apenas "tail" para resolver esse problema, você pode usar este comando:

cat file.txt | tail -r | tail -n +2 | tail -r

Explicação:

  1. tail -r : simplesmente inverte a ordem das linhas em sua entrada

  2. tail -n +2 : isso imprime todas as linhas a partir da segunda linha em sua entrada

Você pode combinar isso com a solução fornecida pela Olaf Dietsche para resolver sua dúvida.

    
por 16.10.2016 / 06:01
0

Em python eu faria assim.

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    L = []
    for line in f:
        line = re.sub(r'\n', r'', line)
        L.append(line)
    print('\n'.join(L[1:-1]))

Cole o código acima em um arquivo e nomeie-o como script.py . Execute o script no arquivo que você deseja verificar.

python3 script.py /path/to/the/file

Exemplo:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana
    
por 18.11.2014 / 16:40