baca rentang garis yang ditentukan dari file

15

Saya punya file saya yang berisi 100000 baris bagaimana saya bisa mendapatkan baris dari baris # 5555 ke baris # 7777 di linux.

Terima kasih untuk segalanya.


sumber
1
@ibrahim, pertimbangkan menerima jawaban Kyle (dengan mencentang tanda centang hijau di sebelah kiri) jika itu membantu Anda
Jonik
Anda mungkin tepat jika Anda ingin menggunakan sed atau jika alat lain OK.
Manu H
Sedikit riset melempar setidaknya stackoverflow.com/questions/83329/…
sancho.s Reinstate Monica

Jawaban:

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

Ini akan mencetak baris 5555-7777 dari file secara inklusif.

Dennis Diposting di bawah ini yang saya setuju harus lebih cepat:

sed '5555,7777p; 7778q' filename

Bukti berikut bahwa itu harus lebih cepat:

$ 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

Hanya di Bash (untuk bersenang-senang):

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
sumber
Saya pikir Anda $n -gt 3harus 7777 mungkin? Juga, Anda dapat melakukannya if (( n >= 5555 ))untuk operator perbandingan numerik yang tampak lebih "alami" (dan kemampuan untuk meninggalkan tanda dolar). Dan kamu bisa melakukannya ((n++)).
Dijeda sampai pemberitahuan lebih lanjut.
16

Berhenti saat Anda selesai dapat mempercepat:

sed -n '5555,7777p; 7778q' input_file
Dijeda sampai pemberitahuan lebih lanjut.
sumber
1
+1, harus lebih cepat, perbarui posting saya untuk menunjukkan alasannya.
Kyle Brandt
7

Salah satu dari ini harus bekerja;

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

Pertanyaan besar;)

Chopper3
sumber
1

Saya menemukan bahwa opsi sed tidak bekerja pada file mysqldump, saya menduga karena menangani umpan garis atau karakter multibyte yang dikutip. kepala dan ekor mengirisnya menggunakan nomor baris yang sama dengan grep yang saya butuhkan. Untuk mendapatkan baris $ j hingga $ k, Anda perlu:

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