Split komutunu kullanarak bir metin dosyasını nasıl% 70 ve% 30'a bölebilirim?
Split komutunu kullanarak bir metin dosyasını nasıl% 70 ve% 30'a bölebilirim?
Yanıtlar:
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
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
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
: csplit
bö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ı head
s aptal ve standartlara uymayacak olsa da, bu tüm kurulumlarda çalışmaz ...
{ 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 split
biraz aşırıya kaçıyor. Yani uzun dosya aranabilir olduğu gibi, dd
sadece tek yapacak read()
ON <stdin
öylesine ve cat
it'i başlamak bırakılır read()
neyse noktasında dd
o 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 dd
s' iflag=fullblock
.
Aşağıdaki kod herhangi bir oran kullanılarak head
ve bu tail
oranla ç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