Saya punya file teks biasa (dengan jumlah baris) yang besar yang ingin saya bagi menjadi file yang lebih kecil, juga dengan jumlah baris. Jadi jika file saya memiliki sekitar 2M baris, saya ingin membaginya menjadi 10 file yang berisi 200rb baris, atau 100 file yang berisi 20rb baris (ditambah satu file dengan sisanya; secara merata dapat dibagi tidak masalah).
Saya bisa melakukan ini dengan cukup mudah di Python tapi saya bertanya-tanya apakah ada cara ninja untuk melakukan hal ini menggunakan bash dan unix utils (yang bertentangan dengan pengulangan manual dan penghitungan / garis partisi).
cat part* > original
Jawaban:
Sudahkah Anda melihat perintah split?
Anda dapat melakukan sesuatu seperti ini:
yang akan membuat file masing-masing dengan 200000 baris bernama
xaa xab xac
...Pilihan lain, dipisah berdasarkan ukuran file keluaran (masih terbelah saat jeda baris):
membuat file seperti
output_prefix01 output_prefix02 output_prefix03 ...
masing - masing ukuran maksimal 20 megabyte.sumber
split -b 200m filename
(m untuk megabita, k untuk kilobyte atau tanpa akhiran untuk byte)-d
opsi tidak tersedia di OSX, gunakangsplit
saja. Semoga ini bermanfaat bagi pengguna Mac.Bagaimana dengan perintah split ?
sumber
Ya, ada
split
perintah. Ini akan membagi file dengan garis atau byte.sumber
split -l 1000000 train_file train_file.
dan dalam direktori yang sama saya akan dapatkantrain_file.aa
dengan juta pertama, kemudiantrail_file.ab
dengan jutaan berikutnya, dll.split input my/dir/
.menggunakan
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
sumber
Menggunakan:
Di sini, 1 dan 100 adalah nomor baris yang akan Anda tangkap
output.txt
.sumber
split
seperti semua jawaban teratas di sini sudah memberi tahu Anda.pisahkan file "file.txt" menjadi 10.000 baris file:
sumber
split
(dari GNU coreutils, sejak versi 8.8 dari 2010-12-22 ) termasuk parameter berikut:Dengan demikian,
split -n 4 input output.
akan menghasilkan empat file (output.a{a,b,c,d}
) dengan jumlah byte yang sama, tetapi garis mungkin terputus di tengah.Jika kita ingin mempertahankan baris penuh (mis. Dibagi dengan baris), maka ini akan berhasil:
Jawaban terkait: https://stackoverflow.com/a/19031247
sumber
Jika Anda hanya ingin membagi dengan x jumlah baris setiap file, jawaban yang diberikan
split
adalah OK. Tapi, saya ingin tahu tentang tidak ada yang memperhatikan persyaratan:Saya tidak dapat melakukannya tanpa "wc + cut", tetapi saya menggunakan itu:
Ini dapat dengan mudah ditambahkan ke fungsi bashrc Anda sehingga Anda bisa memintanya lewat nama file dan potongan:
Jika Anda hanya ingin x potongan tanpa sisa dalam file tambahan, cukup sesuaikan rumus untuk menjumlahkannya (potongan - 1) pada setiap file. Saya menggunakan pendekatan ini karena biasanya saya hanya ingin x jumlah file daripada x baris per file:
Anda dapat menambahkannya ke skrip dan menyebutnya "cara ninja", karena jika tidak ada yang sesuai dengan kebutuhan Anda, Anda dapat membuatnya :-)
sumber
-n
opsisplit
.Anda juga bisa menggunakan awk
sumber
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
HDFS mendapatkan file kecil dan tumpah ke ukuran properti.
Metode ini akan menyebabkan jeda baris
Saya mencoba untuk mendapatkan dan membagi menjadi sekitar 128MB setiap file.
sumber