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
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:
-
tail -r
: inverte a ordem das linhas em sua entrada -
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]))'
head -n -1
remove a primeira E a última linha do meu arquivo.txt
, no Ubuntu 14.04.2LTS.head -n -1
dizhead: illegal line count -- -1
head -n -1
funciona com GNU coreutils, talvez o MacOS tenha alguma variante BSD?