Como excluo as primeiras n linhas de um arquivo ascii usando comandos de shell?

93

Eu tenho vários arquivos que contêm informações de texto ascii nas primeiras 5 a 10 linhas, seguidas por informações matriciais bem tabuladas. Em um script de shell, desejo remover essas primeiras linhas de texto para poder usar as informações da matriz pura em outro programa. Como posso usar comandos bash shell para fazer isso?

Se for de alguma ajuda, estou usando o RedHat e os sistemas Linux linux.

Paulo
fonte

Respostas:

144

Desde que o arquivo não seja um link simbólico ou um link físico, você pode usar sed, tail ou awk. Exemplo abaixo.

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

Você também pode usar sed no local, sem um arquivo temporário: sed -i -e 1,3d yourfile. Isso não ecoará nada, apenas modificará o arquivo no local. Se você não precisar canalizar o resultado para outro comando, isso é mais fácil.

rabo

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
Ignacio Vazquez-Abrams
fonte
8
Você também pode usar sed no local, sem um arquivo temporário: sed -i -e 1,3d yourfile. Isso não ecoará nada, apenas modificará o arquivo no local. Se você não precisar canalizar o resultado para outro comando, isso é mais fácil.
Yanick Girouard
1
Obrigado @YanickGirouard, @IgnacioVazquezAbrams! Vocês dois me salvaram uma tonelada de trabalho manual em minha pesquisa! :)
Paulo
2
@Svetlana sed -iespecificamente. A maioria das implementações apenas exclui o arquivo e o substitui por um novo, que não funciona para links, pois você acaba deixando o original em outro local.
Jw013
6
Que tal explicar o que '1,3d', +4, etc. significa? A pergunta era para n linhas, mas você não disse o que n é (como aparentemente n é 2 em seus exemplos, embora não seja óbvio para um noob o que mudar para mudar n)
Robin Manoli
3
Isso usa um arquivo temporário, portanto, não é muito útil para um espaço em disco de 100%. Seria interessante ter uma solução que faça isso literalmente "no local".
Shai
10

sed -i '1,3d' file.txt

Isso exclui as 3 primeiras linhas do arquivo.txt.

alhelal
fonte
6

Se as linhas tabuladas tiverem um caractere de tabulação:

grep '␉' <input_file >output_file

( sendo um caractere de tabulação literal) ou equivalente

sed -n '/␉/p' <input_file >output_file

Em um script bash / ksh / zsh, você pode escrever $'\t'para uma guia, por exemplo, grep $'\t'ou sed -n $'/\t/p'.

Se você deseja eliminar 10 linhas no início do arquivo:

tail -n +11 <input_file >output_file

(observe que é +11para eliminar 10 linhas, porque +11significa "começar da linha 11" e numerar as linhas de 1) ou

sed '1,10d' <input_file >output_file

No Linux, você pode aproveitar a -iopção do GNU sed para modificar arquivos no local:

sed -i -n '/\t/p' *.txt

Ou você pode usar um loop de shell e arquivos temporários:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

Ou, se você não quiser modificar os arquivos no local, dê um nome diferente a eles:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
Gilles
fonte
3
"tabulado" geralmente significa "impresso em uma tabela", não "recuado com caracteres de tabulação".
Ignacio Vazquez-Abrams
@ IgnacioVazquez-Abrams eu sei. Às vezes, a tabela com impressão bonita usa caracteres de tabulação, mais fáceis de identificar do que colunas alinhadas. É claro que, se Paul desse uma amostra de entrada, eu poderia dar uma correspondência melhor.
Gilles
2

Você pode usar o Vim no modo Ex:

ex -sc '1d5|x' file
  1. 1 mover para a primeira linha

  2. 5 selecione 5 linhas

  3. d excluir

  4. x salvar e fechar

Steven Penny
fonte
0

eco "a \ nb" | sed '1d' # exclui a primeira linha

cat list.txt | sed '1d'> list.csv # leia list.txt e escreva list.csv sem primeira linha

Outros comandos úteis:

grep '^ |' # localiza o primeiro caractere (pipe |)

sed 's / | // g' # exclui o pipe

sed 's / // g' # exclui espaço

Samran Elahi
fonte
0

Por porcentagem

Usando bash, para limpar um arquivo usando um número percentual em vez de um número absoluto de linhas:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

Cuidado porque esse comando pode ser destrutivo, pois exclui o conteúdo no local, sem criar uma cópia.

Exclui os primeiros 75% das linhas do arquivo mencionado.

pgr
fonte