İçeriğe Göre Dosya Bölmek
Problem, çözüm, huzur. Son karşılaştığım problem sonrasında dosyaları içeriğe göre nasıl bölebileceğimi öğrenerek huzura erdim (bir kaç hafta öncesi). Dosyaları paylaşırken küçük parçalara bölmek yaygın olarak kullanılan bir yöntemdir. Fakat buradaki bölme işlemi içeriğe göre değil boyuta göredir. Genellikle bölme aynı anda bir sıkıştırma yöntemiyle birlikte kullanıldığından parçalar normal gözler için anlamlı değildir. İçeriğe göre bölmede ise parçalar istenilen şekilde anlamlı alt parçalara bölünür.
GNU/Linux'taki harika araçlardan biri olan csplit sayesinde metin dosyalarınızı içeriğe göre bölebilirsiniz. csplit büyük ihtimalle sisteminizde kuruludur. Eğer sisteminizde csplit yoksa dağıtımınızın paket yöneticisini kullanarak coreutils paketini yükleyebilir ve csplit komutunu kullanmaya başlayabilirsiniz. Windows kullanıcısıysanız csplit'ten yararlanmak için coreutils'in Windows sürümünü yükleyebilirsiniz.
csplit'in nasıl kullanabileceğini örnek bir metin dosyası üzerinde görelim:
Elimizde içeriği aşağıdaki gibi olan hikayeler.txt isminde bir hikaye kitabı olduğunu varsayalım ve bu kitabı hikaye hikaye bölmek istediğimizi düşünelim:
hikayeler.txt:
önsöz
abc
cde
efg
ghi
hikaye 1
asd
asd
asd
asd
as
d
hikaye 2
hjk
hjk
hjk
hjk
hjk
hjk
hj
k
hikaye 3
rty
rty
rty
rty
rty
rty
rty
rt
y
csplit kullanmıyor olsak bile hikaye kitabı kısa olduğundan elle kopyala yapıştır yaparak bölme işlemini gerçekleştirebiliriz fakat bu kısa bir metin için bile gereksiz uzunlukta bir zaman harcamamıza neden olacaktır. csplit ile sadece:
csplit hikayeler.txt /1/ /2/ /3/
komutu yeterli olacaktır. Oluşan yeni dosyalar ve içerikleri şöyle olacaktır:
xx00:
önsöz
abc
cde
efg
ghi
xx01:
hikaye 1
asd
asd
asd
asd
as
d
xx02:
hikaye 2
hjk
hjk
hjk
hjk
hjk
hjk
hj
k
xx03:
hikaye 3
rty
rty
rty
rty
rty
rty
rty
rt
y
Eğer hikayelerde çeşitli rakamlar olsaydı bu kadar şanslı olamayacaktık kullandığımız komutla, çünkü bölme işlemi yanlış yerlerden gerçekleşecekti. Daha gerçek hayat problemleri için yapılabilecekleri ilerleyen bölümlerde göreceğiz. Şimdilik adım adım devam edelim.
Eğer belli ifadelerden önceki bölümler istenmiyorsa:
csplit hikayeler.txt %1% /2/ /3/
komutunun bir benzeri kullanabilir. Bu sefer sadece üç dosya oluşur ve önsözü içeren bölüm alınmamış olur.
İlerlemeye devam etmeden önce csplit'in alabileceği parametreler hakkında kısa bilgiler edinelim. -s seçeneği ile oluşan yeni dosyaların boyutlarının (karakter sayılarının) ekranda görüntülenmesi engellenebilir ve -f seçeneği ile de standart xx öneki yerine farklı ifadeler kullanılabilir. Komut içinde görelim:
csplit -s -f hikaye. hikayeler.txt /1/ /2/ /3/
hikaye.00 hikaye.01 hikaye.02 hikaye.03 hikayeler.txt
Diyelim elimizdeki kitap uzun ve üç değil kırk üç hikayeden oluşmakta. Komutu gereksiz yere uzatmamıza gerek yok. Eğer hikayeler hikaye 1, hikaye 2 .. hikaye 43 biçiminde isimlendirilmişse
csplit -s -f hikaye. hikayeler.txt /^hikaye/ "{42}"
komutu kullanılabilir bölme işlemi için.
Eğer hikayeler numaralandırılmamışsa kaç tane olduklarını saymamıza gerek yok cspilt bunu da bir hata vererek bize bildirmektedir. Bize kalan tek şey de hata mesajındaki bilgiden yararlanarak hikayelerin gerçek sayısı ile komutu bir kez daha çalıştırmak. Bu sırada fark edeceğiniz üzere herhangi bir hata oluştuğunda daha önceden bölünmüş dosyalar siliniyor, eğer bu durum işe gelmiyorsa -k anahtarıyla csplit'e bunu yapmaması söylenebilir. Ayrıca bölünmüş dosyalar arasındaki boş dosyalar da silinmek istenirse -z parametresi kullanılabilir (anlam karmaşası gibi olmasın ama silmekten ziyade oluşmasını engelleme diyebiliriz, çünkü numaralandırma buna göre düzenleniyor).
Hem kaç tane hikaye olduğu bilinmiyor hem de tek seferde hepsi hemen bölünmek isteniyorsa da
csplit -s -f hikaye. hikayeler.txt /^hikaye/ "{*}"
komutu kullanılabilir. Yapılabilecekler (daha doğrusu bölünebilecekler) bunlarla sınırlı değil, daha fazlası için kaynaklara göz atabilirsiniz.
Kaynaklar:
- Splitting Files by Context: csplit
- man csplit
- Büyük SQL Dosyalarıyla Çalışma
- csplit
- csplit -s -f pro. Chap2.lst /^listing/+1 "{*}" komutuyla çözülebilen bahsi geçen problem, konunun bittiği yerden de anlaşılacağı üzere, ayrıca ya neyse bir şey demiyorum ya
Yorumlar
Yorum Gönder
sen de yaz yaz yaz buraya yaz bütün sözlerini