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.

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

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.


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

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


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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.