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

76

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

Se for de alguma ajuda, estou usando RedHat e um sistema Linux Ubuntu.

    
por Paul 03.05.2012 / 01:36

4 respostas

119

Contanto que o arquivo não seja um symlink ou hardlink, 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 o sed in-loco sem um arquivo temporário: sed -i -e 1,3d yourfile . Isso não vai ecoar nada, apenas modificará o arquivo no local. Se você não precisa canalizar o resultado para outro comando, isso é mais fácil.

final

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90
    
por 03.05.2012 / 01:40
5

Se as linhas tabuladas forem aquelas que têm 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ê quiser eliminar 10 linhas no início do arquivo:

tail -n +11 <input_file >output_file

(observe que é +11 para eliminar 10 linhas, porque +11 significa "início da linha 11" e cauda números de 1) ou

sed '1,10d' <input_file >output_file

No Linux, você pode aproveitar a opção -i do GNU sed para modificar os arquivos:

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, mas em vez disso, dê um nome diferente a eles:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
    
por 03.05.2012 / 03:06
5

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

Isso exclui as 3 primeiras linhas do arquivo.txt.

    
por 28.12.2017 / 14:13
2

Você pode usar o Vim no modo Ex:

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

  2. 5 selecione 5 linhas

  3. d delete

  4. x salvar e fechar

por 17.04.2016 / 03:14