Perintah csplit Linux: bagi teks pada baris dan pola judul
Perintah csplit membagi teks pada nomor baris atau batas yang cocok dengan pola. Gunakan csplit untuk memisahkan bagian dokumen, misalnya bab yang dimulai dengan judul tertentu. Baris yang menjadi batas biasanya masuk ke potongan berikutnya, sehingga lokasi batas perlu diperiksa pada data latihan.
Untuk potongan berukuran byte atau jumlah baris yang seragam, gunakan perintah split untuk pembagian dan pemulihan berkas. Csplit memberi kendali pada titik pembagian. Nama keluaran GNU csplit secara bawaan dimulai dari xx00 dan xx01; pakai direktori baru agar nama itu tidak bertabrakan dengan berkas lain.
Sintaks dan aturan batas
csplit [OPSI] BERKAS_MASUKAN POLA...
OPSI, BERKAS_MASUKAN, dan POLA adalah penanda yang perlu diganti. Tanda - sebagai nama berkas membaca masukan standar. Periksa csplit --version, csplit --help, dan man csplit pada sistem yang dipakai karena perluasan GNU belum tentu tersedia pada implementasi lain.
- Nomor baris, seperti 11, menulis bagian sebelum baris tersebut. Dengan batas pertama 11, potongan awal berisi sepuluh baris.
- Bentuk
/EKSPRESI_REGULER/mencari baris yang cocok. Tanpa offset atau opsi penghilangan, baris yang cocok menjadi awal potongan berikutnya. - Bentuk
'{N}'mengulangi pola sebelumnya N kali lagi. Bentuk GNU'{*}'mengulangi pembagian selama masih memungkinkan.
Kutip pola dan tanda pengulangan agar shell meneruskannya sebagai satu argumen. Ekspresi reguler mempunyai karakter bermakna khusus: pada pola /^Chapter /, tanda ^ membatasi kecocokan ke awal baris dan spasi setelah Chapter juga harus ada.
Bagi pada baris ke-11 dengan data lengkap
Jalankan seluruh blok berikut di Bash atau shell yang mendukung sintaksnya. Blok membuat direktori latihan baru, teks bernomor 1 sampai 15, dan dua contoh dokumen bab. Semua masukan untuk contoh lanjutan disiapkan di dalam blok. Tanda kurung membatasi perpindahan direktori pada subshell.
(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
seq 1 15 > notes.txt
printf 'intro\nChapter 1\nalpha\nChapter 2\nbeta\n' > report.txt
cp report.txt book.txt
csplit -f part- notes.txt 11
printf 'Lab files: %s\n' "$labdir"
)
Potongan part-00 berisi angka 1 sampai 10, sedangkan part-01 berisi 11 sampai 15. Csplit menampilkan ukuran potongan dalam byte, bukan jumlah baris: pada data ini angkanya 21 dan 15. Data angka dua digit memakai lebih banyak byte, sehingga ukuran byte tidak sama dengan jumlah baris.
Pindah ke lokasi yang dicetak sesudah Lab files: menggunakan cd "/jalur/latihan-yang-dicetak" dengan mengganti penanda jalurnya. Periksa wc -l notes.txt part-00 part-01: jumlahnya 15, 10, dan 5 baris. Baris total menjumlahkan semua berkas yang diminta, termasuk sumber.
Untuk memeriksa pemulihan tanpa mengubah sumber, jalankan cat part-00 part-01 > notes-restored.txt, lalu cmp notes.txt notes-restored.txt. Cmp yang berstatus 0 tidak menampilkan perbedaan. Pastikan berkas tujuan belum berisi data penting dan jangan memakai tujuan yang sama dengan salah satu masukan.
Bandingkan satu kecocokan dan pengulangan
Satu pola menghasilkan satu batas
Di direktori latihan tadi, report.txt berisi intro, Chapter 1, alpha, Chapter 2, dan beta, masing-masing pada satu baris. Perintah berikut hanya memakai kecocokan judul bab yang pertama.
csplit -f section- report.txt '/^Chapter /'
Berkas section-00 berisi intro, sedangkan section-01 berisi Chapter 1 hingga beta, termasuk Chapter 2. Menyebut satu pola sekali tidak otomatis membagi seluruh bab. Hitungan byte yang dicetak adalah 6 dan 31 pada contoh ini.
Ulangi pola untuk semua batas yang ditemukan
Berkas book.txt mempunyai isi yang sama dengan report.txt. GNU '{*}' mengulangi pola sebelumnya, sehingga judul bab berikutnya juga menjadi batas.
csplit -f chapter- book.txt '/^Chapter /' '{*}'
Hasilnya chapter-00 berisi intro, chapter-01 berisi Chapter 1 dan alpha, serta chapter-02 berisi Chapter 2 dan beta. Ukurannya 6, 16, dan 15 byte. Kecocokan tetap peka terhadap huruf besar dan kecil pada pola contoh: chapter tidak sama dengan Chapter.
Untuk membandingkan jumlah pengulangan, csplit -s -f twice- book.txt '/^Chapter /' '{1}' mengulangi pola satu kali lagi. Karena bahan latihan mempunyai dua judul yang cocok, hasil isinya sama dengan contoh '{*}'. Pada dokumen dengan jumlah bab berbeda, kedua bentuk tidak selalu menghasilkan pembagian yang sama.
Lihat langsung isi potongan berdasarkan pola
Blok berikut berdiri sendiri dan membuat direktori latihan baru, sehingga nama part-00 dan part-01 tidak bercampur dengan pembagian 15 baris tadi. Opsi -s menyembunyikan hitungan byte; opsi itu tidak menonaktifkan pesan kesalahan.
(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
printf 'one\nTWO\ntwo\n' > sample.txt
csplit -s -f part- sample.txt '/^TWO$/'
cat part-00
cat part-01
printf 'Lab files: %s\n' "$labdir"
)
Keluaran kedua cat sebelum lokasi latihan dicetak adalah:
one
TWO
two
Berkas part-00 berisi one dan karakter baris barunya. Berkas part-01 memuat TWO dan two. Pola /^TWO$/ mencocokkan satu baris penuh dengan huruf besar tersebut: ^ berarti awal baris, sedangkan $ berarti akhir baris. Baris TWO tetap disimpan pada potongan kedua.
Opsi keluaran dan penamaan
| Opsi | Kegunaan |
|---|---|
-f AWALAN |
Menentukan bagian awal nama potongan keluaran. |
-n N |
Menentukan jumlah digit akhiran angka; bawaan menggunakan dua digit. |
-s |
Menyembunyikan hitungan ukuran byte pada keluaran standar. |
-z |
Meniadakan potongan berukuran nol byte. |
-k |
Mempertahankan potongan keluaran yang dibuat ketika terjadi kesalahan. |
Contohnya, csplit -s -n 3 -f wide- notes.txt 11 membuat wide-000 dan wide-001. Tentukan awalan baru untuk setiap percobaan; opsi -f bukan perlindungan otomatis terhadap berkas yang sudah ada.
Kesalahan pola dan potongan kosong
Periksa status, bukan hanya keberadaan berkas
Pola yang tidak menemukan kecocokan atau nomor baris di luar masukan dapat membuat perintah gagal. Secara bawaan, GNU csplit menghapus potongan yang dibuatnya pada operasi gagal. Opsi -k mempertahankannya untuk pemeriksaan, tetapi status perintah tetap gagal dan potongannya belum boleh dianggap sebagai hasil lengkap.
Dalam skrip, periksa status segera, misalnya dengan konstruksi if pada perintah csplit. Jangan mengabaikan kegagalan hanya karena ada berkas dengan awalan yang diharapkan. Berkas lama juga dapat tertimpa; direktori terpisah tetap diperlukan. Rincian pola, pengulangan, dan penanganan kesalahan tersedia dalam manual GNU coreutils 9.11, bagian csplit invocation.
Batas pada awal berkas dapat membuat potongan kosong
Jika kecocokan pertama berada di baris pertama, bagian sebelum batas itu tidak berisi data. GNU -z meniadakan potongan kosong tersebut dan penomoran hasil tetap dimulai dari nol secara berurutan. Periksa isi setiap potongan; jangan menganggap akhiran 00 selalu berarti pengantar sebelum bab.
Contoh di atas mempertahankan seluruh baris batas, sehingga potongan berurutan dapat digabung untuk memulihkan sumber. Aturan lain seperti %POLA% atau --suppress-matched membuang bagian tertentu; setelah memakai aturan itu, menggabungkan potongan saja tidak lagi memulihkan masukan lengkap. Ringkasan opsi dapat dibaca pada manual GNU csplit yang ditayangkan di man7.
FAQ
Kapan memakai split dan kapan memakai csplit?
Gunakan split untuk potongan berdasarkan ukuran byte atau jumlah baris per potongan. Gunakan csplit ketika batasnya ditentukan oleh nomor baris atau pola judul tertentu. Uji batas pada contoh kecil sebelum memproses dokumen sebenarnya.
Mengapa hitungan yang dicetak berbeda dari jumlah baris?
Csplit mencetak ukuran setiap potongan dalam byte. Untuk menghitung karakter baris baru, gunakan wc -l; untuk ukuran byte gunakan wc -c. Opsi -s hanya menyembunyikan hitungan ukuran yang dicetak csplit.




