2016-08-30 1 views
1

大きなテキストファイルがあり、各エントリにヘッダ-XXXX-とフッター$$$$が繰り返されています。約20kのエントリがあり、それをそれぞれ500エントリのファイルに分けていきたいと思います。デリミタのn番目のインスタンスでテキストファイルを複数のファイルに分割

私はawkとおしゃべりしています。以下のコマンドを使用して閉じています。各ファイルは-XXXX-で始まりますが、最初のファイル以降のすべてのファイルには最後に部分的なエントリがあります。例えば

awk "/-XXXX-/ { delim++ } { file = sprintf(\"file%s.sdf\", int(delim/500)); print > file; }" < big.sdf 

-XXXX- 
Beginning 
Middle 
End 
$$$$ 
-XXXX- 
Beginning 

私の代わりに、各ファイルが$$$$直後に終了します。

Windowsではawkを使用しています。

+0

「最後に部分的なエントリがあると、すべてのファイルが終了しました」と言うときは、入力データファイルまたは現在出力している内容を記述していますか? ? –

+0

現在取得中の出力です。最初のファイルは、$$$$のすぐ下で正しく切り落とされます。後続のファイルには、-XXXX-の後に部分的なエントリが含まれます。 注:上記のコードをWindowsボックスのCygwinシェルで実行した場合、正しい動作が得られますが、Windowsのコマンドプロンプトを使用して実行すると、前述のように消えます。 – macaday

+0

何が起こっているのかを私が理解することは非常に困難になるだろう。私は何十年もの間に初めてWindowsマシンにアクセスすることはできないため、問題を非常に簡単に再現することはできません。あなたが言うことは、独特のように聞こえる。ファイルは改行で終了していますか(WindowsではCRLF)?もしそうでなければ、それはあなたが見ているものの一部を占めるかもしれません。 –

答えて

2

-XXXX-と$$$$の間の各データセットがレコードである場合、ファイルを分割するために一度に500レコードを書きたいとしますか? 2つのカウンタが必要になるようです.1つは出力ファイル名のために、もう1つは現在の「バッチ」のレコード数で500まで増えますが、次のバッチではゼロにリセットされます。以下のような何か:

BEGIN {fctr=1 ; rctr=0 ; file=("file" fctr ".sdf")} 
/^\$\$\$\$$/ {print > file ; rctr+=1} 
rctr==500 {fctr+=1 ; file=("file" fctr ".sdf") ; rctr=0} 
!/^\$\$\$\$$/ {print > file} 
  • 1行目は、初期値を設定し、

  • 2行目は、各レコードのフッターに一致するfile1.sdfから始まり、そして我々は、レコードカウンタ、我々が見るたびにインクリメント1(現在のフッタを書き出すだけでなく)

  • 3行目は500レコードに達したときです。最初に次のファイル名に移動し、レコード数をゼロにリセットします。

  • 4行はすべての正規の行です。現在のファイル名であればどれにでも送信してください。

関連する問題