Bagaimana saya bisa membagi file teks menjadi 70% dan 30% menggunakan perintah split?
Bagaimana saya bisa membagi file teks menjadi 70% dan 30% menggunakan perintah split?
Jawaban:
Perintah di bawah ini akan bekerja untuk persentase di atas 50% (jika Anda ingin membagi hanya menjadi dua file), pendekatan cepat dan kotor.
1) membagi 70% berdasarkan garis
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) membagi 70% berdasarkan byte
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Anda dapat menggunakan csplit
untuk membagi menjadi dua bagian (menggunakan persentase berapa pun) mis. Bagian pertama - 20% pertama dari baris, bagian kedua - 80% sisanya dari baris:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: Jumlah baris
2 / 10
: persentase
+1
: menambahkan satu baris karena csplit
perpecahanup to but not including line N
Anda hanya dapat membagi berdasarkan garis.
Pada dasarnya, selama Anda memiliki nomor baris melalui $(( $(wc -l < file) * 2 / 10))
Anda dapat menggunakan alat berorientasi garis apa pun:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
atau, lebih dingin:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
meskipun beberapa head
s bodoh dan tidak akan mematuhi standar sehingga ini tidak akan berfungsi pada semua pengaturan ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... harus bekerja untuk kasing sederhana ini karena Anda hanya membelah sekali - dan mungkin split
sedikit berlebihan. Selama file dapat dicari, dd
hanya akan melakukan satu read()
aktif <stdin
, dan cat
dibiarkan untuk memulai read()
pada titik apa pun dd
meninggalkannya.
Jika file tersebut besar maka count=1 bs=$big_ol_num
bisa menjadi sedikit berat, dan itu dapat diblokir dengan beberapa shell matematika ekstra - namun sederhana.
Input yang tidak dapat dicari - seperti dari pipa - mungkin memiringkan dd
hasil, meskipun ini dapat ditangani juga dengan GNUdd
' s iflag=fullblock
.
Kode berikut ini menggunakan head
dan tail
bekerja dengan rasio apa pun (40 hingga 60 dalam hal ini):
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