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.

linux  files  sed 

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

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

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.


7

Salah satu dari ini harus bekerja;

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

Pertanyaan besar;)


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} 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.