Imprimir conteúdo do arquivo sem a primeira e a última linha

54

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

user394
fonte

Respostas:

97

Apenas com sed, sem tubos:

sed '1d;$d' file.txt

NOTA

  • 1primeira linha média
  • dsignifica excluir
  • ; é o separador para 2 comandos
  • $última linha média
Gilles Quenot
fonte
36

Você não precisa saber o número de linhas com antecedência. taile headpode fazer um deslocamento no início ou no final do arquivo, respectivamente.

Esse canal começa na segunda linha do arquivo (pulando a primeira linha) e para na última, mas uma (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 maneira, é claro:

head -n -1 file.txt | tail -n +2
Olaf Dietsche
fonte
Não sei por que, mas head -n -1remove a primeira e a última linha do meu .txtarquivo, no Ubuntu 14.04.2LTS.
Sopalajo de Arrierez
9

Aqui está como fazer isso com awk:

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

Também outra maneira de sed:

sed '1d;x' file.txt

xé um sedcomando avançado , alterna a linha atual com a anterior: a corrente entra no buffer e a anterior vai para a tela e assim por diante enquanto sedprocessa o fluxo linha por linha (é por isso que a primeira linha fica em branco).

awkA solução em cada etapa (linha) coloca a linha atual na variável e começa a imprimi-la somente após a passagem da segunda linha. Assim, temos uma sequência de linhas de merda na tela do segundo ao último, exceto 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á acabam e nunca vemos a linha na tela.

A mesma ideia no perl:

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

$.significa número da linha e $_ linha atual.
perl -né um atalho para a while(<..>) {..}estrutura e -eé para script embutido.

torre
fonte
2

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
Avinash Raj
fonte
2

Para usuários de Mac:

No Mac, head -n -1não funciona. Em vez disso, inverta o arquivo, corte a primeira linha e depois inverta-a:

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

Explicação:

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

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

Sarfraaz Ahmed
fonte