Yi Jingの64ヘキサグラムによると、64個の不均等な部分に分割したいテキストファイルがあります。各ヘキサグラムのパッセージは、数字、ピリオド、および2つの改行で始まるため、正規表現は非常に簡単に記述できます。
しかし、この正規表現に従って実際にテキストファイルを64個の新しいファイルに分割するにはどうすればよいですか?のタスクのようですperl
。しかし、おそらく、私がまったく見逃しているもっと明白な方法があるかもしれません。
Yi Jingの64ヘキサグラムによると、64個の不均等な部分に分割したいテキストファイルがあります。各ヘキサグラムのパッセージは、数字、ピリオド、および2つの改行で始まるため、正規表現は非常に簡単に記述できます。
しかし、この正規表現に従って実際にテキストファイルを64個の新しいファイルに分割するにはどうすればよいですか?のタスクのようですperl
。しかし、おそらく、私がまったく見逃しているもっと明白な方法があるかもしれません。
回答:
最良の方法はawk
と思いますgawk
。
awk -F "([.] )|( / )" '/^[0-9]{1,3}[.]/{x="F"$1"("$2").txt";}{print >x;}' I_Ching_Wilhelm_Translation.txt
-F
各行にフィールドセパレーターを指定します。これは正規表現です。ここでは、複数のセパレータを使用します:". "
と" / "
。したがって、次のような行1. Ch'ien / The Creative
は3つのフィールドに分割されます:1
Ch'ien
およびThe Creative
。後でこれらのフィールドを参照できます$n
。$0
行全体です。
次に、パターンと行を一致させるようにawkに指示 ^[0-9]{1,3}[.]
しx
ます。一致する場合、値をに割り当てます。値xは、print
操作のファイル名として使用されます。この例では"F"$1"("$2").txt"
、行1. Ch'ien / The Creative
がファイル名を与えるように使用しますF1(Ch'ien).txt
gawkでは、キャプチャされたグループにアクセスすることもできます。したがって、コマンドを次のように単純化できます。
gawk 'match($0, /^([0-9]{1,3})[.] (.*) \/ (.*)$/, ary){x="F"ary[1]"("ary[2]")";}{print >x;}' I_Ching_Wilhelm_Translation.txt
ここでmatch
、グループをキャプチャして変数リストに入れますary
。$0
行全体です。ary[0]
すべてが一致しています。ary[1...n]
各グループです。
perlでもできます:
perl -ne 'if(/^([0-9]{1,3})[.] (.*) \/ (.*)$/) {close F; open F, ">", sprintf("F$1($2).txt");} print F' I_Ching_Wilhelm_Translation.txt
結果:
> ls F*
F10(Lü).txt F22(Pi).txt F34(Ta Chuang).txt F46(Shêng).txt F58(Tui).txt
F11(T'ai).txt F23(Po).txt F35(Chin).txt F47(K'un).txt F59(Huan).txt
F12(P'i).txt F24(Fu).txt F36(Ming I).txt F48(Ching).txt F5(Hsü).txt
F13(T'ung Jên).txt F25(Wu Wang).txt F37(Chia Jên).txt F49(Ko).txt F60(Chieh).txt
F14(Ta Yu).txt F26(Ta Ch'u).txt F38(K'uei).txt F4(Mêng).txt F61(Chung Fu).txt
F15(Ch'ien).txt F27(I).txt F39(Chien).txt F50(Ting).txt F62(Hsiao Kuo).txt
F16(Yü).txt F28(Ta Kuo).txt F3(Chun).txt F51(Chên).txt F63(Chi Chi).txt
F17(Sui).txt F29(K'an).txt F40(Hsieh).txt F52(Kên).txt F64(Wei Chi).txt
F18(Ku).txt F2(K'un).txt F41(Sun).txt F53(Chien).txt F6(Sung).txt
F19(Lin).txt F30(Li).txt F42(I).txt F54(Kuei Mei).txt F7(Shih).txt
F1(Ch'ien).txt F31(Hsien).txt F43(Kuai).txt F55(Fêng).txt F8(Pi).txt
F20(Kuan).txt F32(Hêng).txt F44(Kou).txt F56(Lü).txt F9(Hsiao Ch'u).txt
F21(Shih Ho).txt F33(TUN).txt F45(Ts'ui).txt F57(Sun).txt
curl http://www2.unipr.it/~deyoung/I_Ching_Wilhelm_Translation.html|html2text -o I_Ching_Wilhelm_Translation.plain
sed 's|^[[:blank:]]*||g' I_Ching_Wilhelm_Translation.plain > I_Ching_Wilhelm_Translation.txt
GNU coreutilsでは、geekosaurが示すようにcsplit
、ファイルを正規表現で区切られた部分に分割するために使用できます。
これは、ファイルを断片に分割する移植可能なawkスクリプトです。によって動作します
getline
複数行(2行)区切り文字を処理するために呼び出します。outfile
セクションヘッダーが検出されたときに、印刷するファイルの名前を変数に設定します。BEGIN {outfile="header.txt"}
{
while (/^[0-9]+\.$/) {
prev = $0; getline;
if ($0 == "") outfile = prev "txt";
print prev >outfile
}
print >outfile
}
nunber.
後には、スラッシュを含むテキストが続きます/
。上記のtwo newlines
ixtmixilixは数値識別子の前にある2行の空白行であり、ヘッダーをより具体的に特定するものと確信していますが、Webページのデータ/^[0-9]+\.
はセクションヘッダーでのみ一致するため、それらに対応する必要はありません(この特定の場合)。ありがとう。特にgetline
PS へのイントロのために。もしそうなら?
while
入力に含まれる場合1.\n2.\n\n
(\n
改行がある場合):2.
ヘッダー行で認識される必要があります。ここでは発生しませんが、より一般的にするためにコードでサポートしています(そして質問の仕様をより厳密に一致させます)。