Split: farklı yüzdelere nasıl bölünür?


14

Split komutunu kullanarak bir metin dosyasını nasıl% 70 ve% 30'a bölebilirim?


Split komutunu kullanmak ister misiniz? Değilse, bunu kesinlikle perl veya python kullanarak düz metin manipülasyonu ile kolayca yapabilirsiniz. Dosya çok yanlış olmadığı sürece, dizeye bellekte okuyun ve dizeyi bölün. Dosya çok büyükse, daha fazla çalışma gerekir.
Faheem Mitha

@Faheem Mitha Dosya 64MB'tır. Bölme kullanma fikrini seviyorum çünkü kod yazmaktan daha hızlı. Şimdi dosyanın% 70'ine karşılık gelen satır sayısını belirlersem, büyük bir dosya ve küçük bir dosya alıyorum. Çalışmamalı mı?
aneuryzm

Ve evet .. işe yaradı .. Soruyu silmeli miyim?
aneuryzm

Size kalmış, ama gerekli değil.
Faheem Mitha

Lütfen cevabınızı paylaşın. ( meta.stackexchange.com/questions/12513/… )
dogbane

Yanıtlar:


13

Aşağıdaki komutlar% 50'nin üzerindeki yüzdeler için (yalnızca iki dosyaya bölmek istiyorsanız) hızlı ve kirli bir yaklaşımla çalışacaktır.

1)% 70'i çizgilere göre ayırın

split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename 

2) baytlara göre% 70 bölme

split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename

1
MacOSX'te wc bazen önünde bir boşluk olan satır sayısını, bu komut dosyasını kıran bir şey döndürür. split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Xargs'a

4

csplitİlk parça - çizgilerin ilk% 20'si, ikinci parça - çizgilerin geri kalan% 80'i gibi iki parçaya (herhangi bir yüzde kullanarak) bölmek için kullanabilirsiniz :

csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))

$(wc -l < infile): toplam satır sayısı
2 / 10: yüzde
+1: csplitbölünmeler nedeniyle bir satır ekleyinup to but not including line N

Yine de sadece çizgilere göre bölünebilirsiniz.
Temel olarak, hat numarasına sahip olduğunuz sürece $(( $(wc -l < file) * 2 / 10))herhangi bir çizgi yönelimli aracı kullanabilirsiniz:

sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile

veya daha da soğuk:

{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile

bazı heads aptal ve standartlara uymayacak olsa da, bu tüm kurulumlarda çalışmaz ...


2
{   BS=$(($(wc -c <file) * $P / 100))
    dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null

... bu basit durum için çalışmalı, çünkü sadece bir kez bölünüyorsunuz - ve muhtemelen splitbiraz aşırıya kaçıyor. Yani uzun dosya aranabilir olduğu gibi, ddsadece tek yapacak read()ON <stdinöylesine ve catit'i başlamak bırakılır read()neyse noktasında ddo yapraklar.

Dosya büyükse count=1 bs=$big_ol_num, a biraz hantal olabilir ve bazı ekstra - ama basit - kabuk matematiği ile engellenebilir.

Olmayan bir aranabilir girişi - bir boru gibi - eğrilebilir dd'bu / GNU ağırlık zamanda işlenebilir da, s sonuçlar dds' iflag=fullblock.


0

Aşağıdaki kod herhangi bir oran kullanılarak headve bu tailoranla çalışır (bu durumda 40 ila 60):

export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw
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.