leggere l'intervallo di righe specificato da un file


15

Ho un file che contiene 100000 righe su come posso ottenere le righe dalla riga # 5555 alla riga # 7777 sotto Linux.

Grazie di tutto.

linux  files  sed 

1
@ibrahim, considera di accettare la risposta di Kyle (spuntando il segno di spunta verde a sinistra) se ti fosse d'aiuto
Jonik,

puoi precisare se vuoi usare sed o se altri strumenti sono OK.
Manu H,

Risposte:


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

Ciò stamperà le righe 5555-7777 del file in modo inclusivo.

Dennis ha pubblicato il seguente testo che concordo dovrebbe essere più veloce:

sed '5555,7777p; 7778q' filename

Le seguenti prove che dovrebbero essere più veloci:

$ 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

Solo in Bash (per divertimento):

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

Penso che $n -gt 3dovresti essere 7777 forse? Inoltre, puoi fare if (( n >= 5555 ))per operatori di confronto numerici dall'aspetto più "naturale" (e la possibilità di lasciare il segno del dollaro). E tu puoi fare ((n++)).
In pausa fino a ulteriore avviso.


7

Ognuno di questi dovrebbe funzionare;

  • sed -n ' startnumber , endnumber p'
  • awk 'NR> = startnumber && NR <= endnumber ' file

Ottima domanda a proposito;)


1

Ho scoperto che l'opzione sed non funzionava su un file mysqldump, immagino a causa della gestione di feed di riga tra virgolette o caratteri multibyte. head e tail lo tagliano usando gli stessi numeri di riga di grep di cui avevo bisogno. Per ottenere le righe da $ j a $ k, devi:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.