Bir metin dosyasının satırlarının orta bölümü çıkarılsın mı?


17

Ondan veritabanı ekler yapmak için büyük bir metin dosyasını ayrıştırmak için bir PHP komut dosyası yazıyorum. Ancak sunucumda dosya çok büyük ve PHP için bellek sınırına ulaştım.

Dosya yaklaşık 16.000 satıra sahiptir; Bunları yükleyip yükleyemeyeceğimi görmek için (ilk başta) dört ayrı dosyaya bölmek istiyorum.

İlk bölümün üstesinden gelebilirim head -4000 file.txt. Orta bölümler biraz daha zor - ben ( ) tailiçine boru çıkışı düşünüyordum , ama başka / daha iyi bir yolu var mı?headtail -4001 file.txt | head -4000 > section2.txt

Aslında mantığım berbat durumda - ikinci bölüm için, böyle bir şey yapmam ve sonraki bölümler tail -12001 file.txt | head - 4000için tailargümanı düşürmem gerekecekti . Ben zaten karışıyorum! : P

Yanıtlar:


27

Eğer dağınık olmak istemiyor tailve yine de ve kullanarak yapmak istiyorsanız head, tailsatır sayısını kullanarak baştan çağırmanın yararlı bir yolu var, son değil:

tail -n +4001 yourfile | head -4000

... Ama sadece dosyaları bölmek için yapılmış daha iyi, otomatik bir araç denir ... split! Aynı zamanda GNU coreutils'in bir parçasıdır, bu yüzden normal bir Linux sistemi buna sahip olmalıdır. Bunu nasıl kullanabileceğiniz aşağıda açıklanmıştır:

split -l 4000 yourInputFile thePrefixForOutputFiles

( man splitŞüpheye bakın .)


19

Baş ve kuyruğu yaptığınız gibi birleştirmek işe yarayacak, ama bunun için kullanacağım sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

Bu, sorununuzu hızlı kabuk işlevi ile çözmenizi sağlar

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

Artık dosya_1-4000 ve yuor_file.4001-8000 vb. Var.

Not: bash gerektirir


3
Sed yolunu seviyorum.
Şubat'ta fanchyna

Bu benim için işe yaramıyor çünkü sed çıkmıyor. Stdout yapmak istediğim satırları yazdırıyor, ancak ctrl-c'yi dışarı çıkarmam gerekiyor ve sonuç olarak bir dosyaya yönlendiremiyorum. Kullanılabilir hale getirmek için herhangi bir öneriniz var mı?
Brent212

Anladım! "sed -n '<start_line>, <end_line> w <output_file>' <input_file>" benim için çalışıyor.
Brent212

@ Brent212 Dikkat edilmesi gereken başka bir seçenek de, daha az boruya geçirebileceğiniz veya çıktıyı bir dosyaya yönlendirebileceğinizdir.
Kyle nin
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.