Membagi file menjadi dua file pada baris tertentu

12

Saya mencari cara unix untuk membagi file menjadi dua file pada nomor baris yang diberikan.

split -l 100 file_namedekat dengan apa yang saya cari, tetapi perintah ini membuat banyak file, masing-masing dari 100 baris. Saya mencari perintah untuk membagi file menjadi dua file pada nomor baris yang diberikan. Apakah ada cara untuk melakukan ini di unix?

penyu
sumber

Jawaban:

12

Solusi yang sedikit lebih ketat:

(head -100 > f1.txt; cat > f2.txt) < input.txt
Rubens
sumber
1
Solusi yang bagus. Tidak ada penghitungan dengan wcsebelumnya dan file input masih diproses hanya sekali, seperti dengan awksolusinya.
Dubu
2
Ada sedikit peluang yang headakan membaca lebih dari 100 baris untuk menemukan 100 baris pertama yang akan di-output f1.txt; byte tambahan itu tidak akan terlihat oleh cat.
chepner
Ini sangat lambat
sdaffa23fdsf
12

Gunakan awk, sehingga Anda hanya perlu membuat satu melewati file input. Berikut ini mengasumsikan Anda menginginkan 122 baris pertama di file pertama, dan sisanya di baris kedua.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name
chepner
sumber
Ini patut diacungi jempol. jika Anda ingin membagi file dari X ke Y, ini adalah yang termudah.
Glenn Plas
Ini adalah solusi termudah untuk dipahami. Bekerja seperti pesona ... dan membuat saya berpikir saya harus menyapu debu buku O'Reilly Sed & Awk saya yang saya miliki sejak 1999 atau lebih, bagian sed sudah banyak dibaca, bagian awk tidak terlalu banyak.
Michael
Ini lebih baik daripada solusi yang dikecualikan karena alasan @ chepner dicantumkan dalam komentar. Anda akan kehilangan karakter di file 'f2.txt'. Solusi ini akurat dan efisien. awk ftw.
Goran
7

Anda dapat menggunakan headdan tailmendapatkan kedua bagian:

head -n K file_name > top_file
tail -n L file_name > bottom_file

di mana Knomor baris, dan Ljumlah baris dari bawah (jumlah total baris - K).

(Anda bisa mendapatkan jumlah total baris menggunakan wc -l file_name).

jh314
sumber
5

Anda dapat menggunakan csplit(jika tersedia) untuk melakukannya:

csplit file N+1

akan membagi file menjadi dua bagian, satu bagian hingga (dan termasuk) nomor baris Ndan bagian lainnya dari nomor baris N+1hingga baris terakhir.
Jika Anda ingin membagi hingga (tetapi tidak termasuk) nomor baris N:

csplit file N
don_crissti
sumber
Itu hebat! Terima kasih, itu menyelesaikan masalah dengan sempurna untuk saya.
Zertrin
Kinerja terbaik untuk memisahkan file 20GB menjadi beberapa bagian.
dr0i
@ dr0i - tidak heran, csplitdioptimalkan untuk pekerjaan ini.
don_crissti
Memisahkan file 200M-baris saya mendapat "kehabisan memori" menggunakan csplit tanggal kembali ke tahun 2008. Menggunakan csplit tanggal hingga 2011 berfungsi :)
dr0i
4

Keduanya headdan tailmemiliki opsi untuk menghasilkan baris dari ujung file "lain" daripada yang seharusnya. Jadi, Anda memiliki dua opsi ini:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

atau (di mana NNN 100 kurang dari output wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Anda dapat membaca halaman manual untuk versi Anda headdan tailuntuk informasi lebih lanjut.

Twalberg
sumber
0

Anda dapat menggunakan 'wc', 'dc', 'head' dan 'tail'. Yaitu

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Untuk kemudahan penggunaan, Anda dapat mengubah di atas menjadi skrip shell.


sumber