bir dosyadan belirtilen satır aralığını oku


15

Nasıl satır # 5555 satır linux altında # 7777 alabilirsiniz 100000 satır içeren i dosya var.

Her şey için teşekkürler.

linux  files  sed 

1
@ibrahim, size yardımcı
olduysa

sed kullanmak veya diğer araçların uygun olup olmadığını kesin olarak belirleyebilirsiniz.
Manu H

Biraz araştırma en azından atar stackoverflow.com/questions/83329/…
sancho.s Monica'yı

Yanıtlar:


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

Bu, dosyanın 5555-7777 satırlarını kapsamlı olarak yazdırır.

Dennis daha hızlı olması gerektiğini kabul ediyorum aşağıdakileri yayınladı:

sed '5555,7777p; 7778q' filename

Daha hızlı olması gerektiğine dair aşağıdaki kanıtlar:

$ 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

Yalnızca Bash'te (eğlence için):

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

Bence $n -gt 3belki 7777 olmalısın? Ayrıca, if (( n >= 5555 ))daha "doğal" görünümlü sayısal karşılaştırma operatörleri (ve dolar işareti bırakma yeteneği) için yapabilirsiniz. Ve yapabilirsin ((n++)).
sonraki duyuruya kadar duraklatıldı.


7

Bunların her ikisi de çalışmalı;

  • sed -n ' başlangıç ​​numarası , bitiş numarası p'
  • awk 'NR> = başlangıç ​​numarası && NR <= son sayı ' dosyası

Bu arada büyük bir soru;)


1

Sed seçeneği bir mysqldump dosyasında işe yaramadı, alıntı satır beslemeleri veya çok baytlı karakterlerin işlenmesi nedeniyle tahmin ediyorum. baş ve kuyruk ihtiyaç duyduğum grep ile aynı satır numaralarını kullanarak dilimleyin. $ J ile $ k arasındaki satırları almak için şunlara ihtiyacınız vardır:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.