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
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.
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
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.
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.
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
tail -r
: simplesmente inverte a ordem das linhas em sua entrada
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.
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
Tags text-processing