One-liner ini akan membagi csv besar menjadi potongan-potongan dari 999 record, mempertahankan baris header di bagian atas masing-masing (jadi 999 record + 1 header =1000 baris)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'
Berdasarkan jawaban Ole Tange.
Lihat komentar untuk beberapa kiat tentang pemasangan paralel
Ini milik robhruska skrip dibersihkan sedikit:
tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
head -n 1 file.txt > tmp_file
cat "$file" >> tmp_file
mv -f tmp_file "$file"
done
Saya menghapus wc
, cut
, ls
dan echo
di tempat-tempat di mana mereka tidak perlu. Saya mengubah beberapa nama file agar lebih bermakna. Saya membaginya menjadi beberapa baris hanya untuk membuatnya lebih mudah dibaca.
Jika Anda ingin tampil mewah, Anda bisa menggunakan mktemp
atau tempfile
untuk membuat nama file sementara alih-alih menggunakan kode keras.
Edit
Menggunakan GNU split
itu mungkin untuk melakukan ini:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Rusak agar mudah dibaca:
split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_
Ketika --filter
ditentukan, split
menjalankan perintah (fungsi dalam hal ini, yang harus diekspor) untuk setiap file keluaran dan menetapkan variabel FILE
, di lingkungan perintah, ke nama file.
Skrip atau fungsi filter dapat melakukan manipulasi apa pun yang diinginkannya pada konten keluaran atau bahkan nama file. Contoh yang terakhir mungkin untuk menghasilkan nama file tetap di direktori variabel:> "$FILE/data.dat"
Misalnya.
Anda dapat menggunakan fungsionalitas --filter baru di GNU coreutils split>=8.13 (2011):
tail -n +2 FILE.in | split -l 50 - --filter='sh -c "{ head -n1 FILE.in; cat; } > $FILE"'