Bir dosyayı satıra bölün ve elde edilen dosya uzantısı üzerinde kontrol sahibi olur


28

Dosya bölme - bölme için standart bir komut vardır.

Örneğin, bir kelime dosyasını 10000 satırlık birkaç parçaya bölmek istersem, şunu kullanabilirim:

split -dl 10000 words wrd

ve wrd.01, wrd.02 ve benzerleri şeklinde birkaç dosya oluşturur.

Ancak bu dosyalar için belirli bir uzantıya sahip olmak istiyorum - örneğin, wtd.01.txt, wrd.02.txt dosyalarını almak istiyorum.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


11

İle değil split, ancak daha sonra kolayca yeniden adlandırabilirsiniz veya bunu yapabilirsiniz awk:

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

İyi görünüyor - ama çalışmıyor. Formunuzda, ">>" ifadesinin ifadesi yeniden yönlendirme değeri boş dize değerine sahip "ve" dosya "" "dosyaadı" olarak değiştirilirse, wrd. {Dosya numarası}. {Line number} formunun dosyalarını verir. .txt (epeyce :)
Rogach

@Rogach Üzgünüm, test etmedim, bu yüzden awk'nin tamsayı bölme yapmadığını unuttum. Bunu test ettim.
Kevin,

49

Bu o zamanlar mevcut değildi, ancak daha yeni sürümlerle ( ≥ 8.16) gnu splitbiri --additional-suffix, ortaya çıkan uzantı üzerinde kontrol sahibi olmak için anahtarı kullanabilir . Kimden man split:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

yani bu seçeneği kullanırken:

split -dl 10000 --additional-suffix=.txt words wrd

sonuçta ortaya çıkan parçalar otomatik olarak bitecektir .txt:

wrd00.txt
wrd01.txt
.........

3
Mac üzerinde çalışmıyor
ericgu

2
İğnelemeni seviyorum. Ben Apple dünyasından bir unix n00b. OS X Yosemite kullanıyorum ve başkalarının da benim gibi çarpmalarını ve yanmalarını istemedim. Dokümanlar üzerinde test edip inceledim ve bu parametreye sahip değiliz. Bir şeyi özlemiş olabilirdim. developer.apple.com/library/mac/documentation/Darwin/Reference/…
ericgu

5
@swiftshokunin - cevabım ilişkindir gnu splitparçası, gnu coreutils. Yüklemek eğer OSX'te da mevcuttur coreutilsyoluyla homebrewancak not varsayılan olarak, OSX üzerinde, o gnuprogramları bir adres g(örneğin kendi adının başına gstatyerine stat) olarak bunun çağırmak bunu gsplit(veya kılavuz uyarınca PATH değiştirmek buraya İstersen splitOSX üzerinde kullanmak için split). HTH.
don_crissti

1
Güzel cevap OS X'te, gsplitsayısal soneklerin (-d) çalışmasını sağlamak için kullanın.
Brent Faust

1
vay, gsplit olduğunu hiçbir fikrim yoktu - muhtemelen yukarıda belirtilen coreutillerden geliyor ve - ek-son eki var. Bu çözüme yorum yapan herkese teşekkürler :)
zukasz Rysiak

13

Bu tür görevler en iyi kabuk ile yönetilir. Split kullanın ve ardından dosyaları yeniden adlandırmak için basit bir döngü yazın. Örneğin

for file in wrd.*
do
    mv "$file" "$file.txt"
done

wrd.01, wrd.02, vb. dosyalarınızı yeniden adlandırırlar, böylece hepsi .txt uzantılıdır.


Bu oldukça açık, ancak bash betiğinin özlülüğünü bozacaktır.
Rogach

1
Unix felsefesi, size bir iş yapmak için birleştireceğiniz bir dizi basit araç sağlamaktır. "Bash betiğinin özlülüğü", sorunuzda belirtilen bir gereklilik değildi.
Kyle Jones

7
Not: split+mvcombo, 10 milyon satırlık bir giriş dosyası için (75 MB) 6 kat daha hızlıdır awk(yaklaşık 3s - 18s ), her satırdaki metin kendi satır numarasıydı ... Tekrar ifade ettiğiniz için teşekkürler "açık" :)
Peter.O

3
PPS: Sadece biraz daha kontrol ediyorum. Hız farkı, çıktı dosyalarının sayısına bakılmaksızın, her bir satır için biçimlendirme ve aritmetik hesaplamalar awk ile oluşturulan dosya sayısıyla ilişkilidir. Çıktı dosyalarının sayısına bakılmaksızın her giriş için aynı giriş ... 100 kez daha az dosyaları split + mvolan 75 kat daha hızlı awkolduğunda: 100 kat daha fazla , dosyalar split + mvolduğunu 1.5 kat daha hızlı daha awk. Yani, benim için bu split + mvyöntem kazanır, eller aşağı. Bu consice (tartışmalı moreso) gibidir ve daha hızlıdır awk.
Peter.O

1
5 satır uzunluğundan endişeleniyorsanız, bunun yerine şunu deneyin: for file in wrd.*; do mv "$file" "$file.txt"; done:)
Tony,
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.