ler o intervalo de linhas especificado de um arquivo

15

Eu tenho o arquivo que contém a linha 100000, como posso obter as linhas da linha 5555 para a linha 7777 no linux.

Obrigado por tudo.


fonte
1
@ibrahim, considerar aceitar a resposta de Kyle (assinalando a marca verde à esquerda) se ele te ajudou
Jonik
você pode precisar se deseja usar o sed ou se outras ferramentas estão OK.
Manu H
Um pouco de pesquisa lança pelo menos stackoverflow.com/questions/83329/…
sancho.s Reinstala Monica

Respostas:

22
sed '5555,7777!d' <filename>

Isso imprimirá as linhas 5555-7777 do arquivo inclusive.

Dennis Postou o seguinte, que eu concordo que deve ser mais rápido:

sed '5555,7777p; 7778q' filename

A seguinte evidência de que deve ser mais rápido:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

Somente no Bash (por diversão):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file
Kyle Brandt
fonte
Eu acho que o seu $n -gt 3deveria ser 7777, talvez? Além disso, você pode fazer isso if (( n >= 5555 ))por operadores de comparação numérica com aparência mais "natural" (e a capacidade de deixar de fora o cifrão). E você pode fazer ((n++)).
Pausado até novo aviso.
16

Parar de terminar pode acelerar as coisas:

sed -n '5555,7777p; 7778q' input_file
Pausado até novo aviso.
fonte
1
+1, deve ser mais rápido, atualizei minha postagem para mostrar o porquê.
precisa saber é o seguinte
7

Qualquer um destes deve funcionar;

  • sed -n 'número inicial , número final p'
  • awk 'NR> = startnumber && NR <= endnumber ' arquivo

Grande pergunta pelo caminho;)

Chopper3
fonte
1

Eu descobri que a opção sed não funcionava em um arquivo mysqldump, acho que devido ao manuseio de feeds de linhas entre aspas ou caracteres multibyte. head e tail cortam usando os mesmos números de linha do grep, que era o que eu precisava. Para obter as linhas $ j a $ k, você precisa:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Dave Crooke
fonte