bir dosyayı bölme: yerine, eg '`


0

Bölünmek istiyorum $ dosya ihtiva eden x satırları ikiye bölün ve kaç satır içerdiğini kontrol edin " ölü "bir günlükte. Aşağıdakilerle başladım:

half=`expr $(egrep -c . $file) / 2`

sed -n 1,${half}p $file | 
    xargs echo $file $half $(egrep -c dead $I) > log_1
sed -n ${half},${egrep -c . $file}p | 
    xargs echo $file $half $(egrep -c dead $I) > log_2

ilk çıktı sed komut tamam, ancak kullanılırken egrep aralığında sed yanlış gider:

DeadOrAlive 5 2
-bash: ${half},${egrep -c . $file}p: bad substitution

Dosyayı bölmenin daha etkili bir yolu var mı? bash?


$(...) ve ${...} farklı yapılardır. Birincisi komut değiştirme, ikincisi parametre genişletmedir.
choroba

Senin ilk egrep boş olmayan satırları sayar. grep -c ^ file boş satırlar dahil toplam satır sayısını üretecektir. (Dosyanız boş satır içermiyorsa, elbette her ikisi de eşdeğerdir.) wc -l <file muhtemelen daha hızlıdır çünkü herhangi bir regex eşlemesi yapması gerekmez. Özellikle boş olmayan satırları saymak istiyorsanız, tabii ki eşleşmeleri kontrol etmeniz gerekir.
tripleee

Ne bekliyorsunuz $I içermek için?
tripleee

sed "$half,\$" satırları seçecek $half Dosyanın sonuna kadar, kodunuz en üstteki dosyayı içerecek olsa da (satır numarası $half ) hem birinci hem de ikinci yarıda.
tripleee

sed "1,${half}d" file ilk silecek $half çizgiler ve gerisini yazdırın. Bununla, dosyayı düzgün bir şekilde örtüşmeyen iki bölüme bölebilirsiniz.
tripleee

Yanıtlar:


0
  1. kullanma wc, head ve tail:

    half=$(( $(wc -l "$file")/2 ))
    head -$half | egrep -c dead | xargs echo "$file" $half > log_1
    tail -$half | egrep -c dead | xargs echo "$file" $half > log_2
    
  2. kullanma split:

    split -a1 --numeric-suffixes=1 -n 'l/2' "$file" "$file"_
    echo "$file" "$file"_1 $(egrep -c dead "$file_1") > log_1
    echo "$file" "$file"_2 $(egrep -c dead "$file"_2) > log_2
    rm "$file"_[12]
    

0

İşte bir Awk çözümü.

awk '/dead/ { a[++n] = NR }
    END { for (i=1; i<=n; i++) if (a[i] > NR/2) break
        print ARGV, int(NR/2), i-1 >"log_1";
        print ARGV, int(NR/2)+(int(NR/2)!=NR/2), n-i+1 >"log_2" }' file

Diziye topluyoruz a maçların satır numaraları. Daha sonra dizideki satır numaralarının kaç tanesinin ortadaki satırdan daha küçük olduğunu bulduk; sayıları ilk bölüme atanır. (Kullanmak zorundayız i-1 çünkü biz zaten ayrılma noktasını geçmişiz, break döngünün dışında.)

Genelde, aynı dosyayı birçok kez tekrar okumaktan kaçınmak istersiniz, özellikle büyükse; ve ikincisi, işlem sayısını en aza indirmeye çalışın.

Orta çıktı alanının neyi içermesini beklediğiniz net değil. Eğer dosya tek sayıda satır içeriyorsa, ilk "yarım" ikinci bölümden daha az bir satır içerecektir. (Bunu değiştirmek zor değil, ancak bir şekilde veya bir başkasına karar vermek zorundasınız.)


Kesinlikle konuşmalıyız close() Açtığımız dosyaları, ancak iki tane olduğu sürece rahatsız etmedim.
tripleee
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.