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?

Jawaban:


12

Solusi yang sedikit lebih ketat:

(head -100 > f1.txt; cat > f2.txt) < input.txt

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

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).


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

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.