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

Existe uma maneira simples de reproduzir um arquivo, pulando a primeira e a última linha? Eu estava olhando para a tubulação de head para 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 com isso.

Resposta

Apenas com sed, sem canos:

sed "1d;$d" file.txt 

NOTA

  • 1 significa primeiro linha
  • d média excluir
  • ; é o separador para 2 comandos
  • $ média última linha

Resposta

Você não precisa saber o número de linhas com antecedência. tail e head podem ser deslocados desde o início ou fim do arquivo, respectivamente.

Este tubo começa em a segunda linha do arquivo (pulando a primeira linha) e pára na última linha (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 

Comentários

  • Não ' t sei por que, mas head -n -1 remove a primeira E a última linha do meu arquivo .txt, no Ubuntu 14.04.2LTS.
  • No MacOS head -n -1 diz head: illegal line count -- -1
  • head -n -1 funciona com GNU coreutils, talvez o MacOS tenha alguma variante BSD?

Resposta

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 o anterior: a corrente vai para o buffer e anterior s vai para a tela e assim por diante enquanto sed fluxo de processamento linha por linha (é por isso que a primeira linha estará em branco).

awk solução 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 uma sequência de linhas shitfed na tela do penúltimo ao penúltimo. 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 $_ a linha atual.
perl -n é um atalho para while(<..>) {..} estrutura e -e é para script embutido.

Resposta

Para usuários do Mac:

No Mac, head -n -1 não funciona. Em vez disso, inverta o arquivo, corte a primeira linha e, em seguida, reverta-a de volta:

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 todos os ines a partir da segunda linha em sua entrada

Comentários

  • Falharia com head: illegal line count -- -1 para ser exato.

Resposta

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 deseja verificar.

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

Exemplo:

$ cat file foo apple banana bar $ python3 script.py file apple banana 

Comentários

  • ''.join(list(open("/path/to/file"))[1:-1]): Esta parece ser uma solução mais simples 🙂 E se você precisar que seja feito no prompt de comando diretamente, você pode tentar: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *