Saya memiliki file teks yang ingin saya bagi menjadi 64 bagian yang tidak sama, menurut 64 heksagram Yi Jing. Karena bagian untuk setiap heksagram dimulai dengan beberapa digit, satu periode, dan dua baris baru, regex harus cukup mudah untuk ditulis.
Tetapi bagaimana saya benar-benar membagi file teks menjadi 64 file baru sesuai dengan regex ini? Sepertinya lebih dari tugas untuk perl
. Tapi mungkin ada cara yang lebih jelas bahwa saya benar-benar hilang.
regular-expression
split
ixtmixilix
sumber
sumber
'\.'
tidak akan bekerja juga?Saya pikir cara terbaik adalah
awk
dangawk
.awk
-F
akan menentukan pemisah bidang untuk setiap baris. Ini adalah regex, di sini kami menggunakan beberapa pemisah:". "
dan" / "
. Dengan demikian garis seperti1. Ch'ien / The Creative
akan dibagi menjadi 3 bidang:1
Ch'ien
danThe Creative
. Nanti kita bisa merujuk ke kolom-kolom ini dengan$n
.$0
adalah seluruh baris.Kami kemudian memberi tahu awk untuk mencocokkan garis dengan pola
^[0-9]{1,3}[.]
Jika ada yang cocok, kami kemudian memberikan nilainyax
. Nilai x akan digunakan sebagai nama file untukprint
operasi. Dalam contoh ini kita menggunakan"F"$1"("$2").txt"
sehingga baris1. Ch'ien / The Creative
memberi nama fileF1(Ch'ien).txt
melongo
Di gawk, kita juga dapat mengakses grup yang ditangkap. Jadi kita bisa menyederhanakan perintah untuk:
di sini kita menggunakan
match
menangkap grup dan memasukkannya ke dalam daftar variabelary
.$0
adalah seluruh baris.ary[0]
semuanya cocok.ary[1...n]
masing-masing kelompok.perl
Kita juga bisa melakukannya dengan perl:
Hasil:
cara mendapatkan file contoh:
sumber
Dengan GNU coreutils, Anda dapat menggunakan
csplit
untuk memecah file menjadi potongan-potongan terbatas-regexp, seperti yang ditunjukkan oleh geekosaur .Berikut ini adalah skrip awk portabel untuk memecah file menjadi beberapa bagian. Ini bekerja dengan
getline
untuk berurusan dengan pemisah multiline (2-line);outfile
ke nama file yang akan dicetak, ketika header bagian ditemui.sumber
nunber.
diikuti oleh teks yang berisi garis miring/
. Saya cukup yakintwo newlines
ixtmixilix yang disebutkan adalah 2 baris kosong yang mendahului pengidentifikasi angka dan akan lebih spesifik mengidentifikasi tajuk, tetapi karena data pada halaman web hanya cocok/^[0-9]+\.
dengan tajuk bagian, tidak perlu untuk memenuhi mereka ( dalam kasus khusus ini). Terima kasih; terutama untuk intro kegetline
.. PS. dapat sementara jika?while
apakah ada dalam kasus input berisi1.\n2.\n\n
(di mana\n
baris baru):2.
harus dikenali di baris header. Ini tidak akan terjadi di sini, tetapi saya mendukungnya dalam kode saya untuk membuatnya lebih umum (dan mencocokkan spesifikasi dalam pertanyaan dengan lebih ketat).