#!/bin/awk -f

#####################################################################################################
# tsepa - TAZEL Output Separator ( TAZEL 出力分離ツール )
# > It separats TAZEL Output into multiple files by its date&time. 	( file name  = ##### 5 digits )
# > size=N specifys set of line count which is considered as same date&time.
# > TAZEL 出力を日時毎にファイルに分けます。						( ファイル名 = ##### 5 桁数値 )
# > size=N の値は日時が同じであると見なす行数を指定します。
#####################################################################################################

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
BEGIN{
# コマンドライン引数の取得＆設定
	if( ARGC!=2 || (ARGV[1]=="-?"||ARGV[1]=="-h") ){
		printf("\n");
		printf("tsepa - GPL/LGPL TAZEL Output Separator (Ver.1) [ Copyright (c) 2023-2023 NekoMimi <twintail@angelmodelnet> ]\n");
		printf("  This program reads STDIN ( expects TAZEL output ) and separates them by UNIXTIME, then\n");
		printf("  saves them into separate file(s).  Output filename is 5 digit sequential number, which starts\n");
		printf("  from 00000 (oldest) to 99999 (newest) by UNIXTIME order.\n");
		printf("\n");
		printf("Usage: tsepa size=N\n")
		printf(" > size=N : It sets continuous N lines as a single data, so that they go into the same file.\n");
		printf(" > ( If the last epoch contains less than N lines, tsepa will ignore the last epoch line(s). )\n");
		printf("\n");
		exit(1)
	}
# パラメータの設定
# ARGV[1]は"="文字が含まれているため、AWKではフィルタ処理の対象ファイル名とはみなさない。
# 続くARGV[2]をフィルタ処理の対象ファイル名とみなす。
	split(ARGV[1],temp,"[=]")
	lhs=temp[1]							# size=N の左辺
	rhs=temp[2]							# size=N の右辺
	if( lhs != "size" ){
		printf("\n");
		printf("Error: Illegal Parameter [%s]\n",ARGV[1])
		printf("\n");
		exit(1);
	}
	size = int(rhs)						# 1回の分離サイズ｜1回の継続行数

	seq          = 0	# 通し番号           （ ファイル名生成用             / 先頭=値1 ）
	tbl_u2seq[0] = 0	# UNIXTIME の通し番号（ tbl_u2seq[UNIXTIME]=通し番号 / 先頭=値1 ）

}

#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
{

# コメント行＆空行のスキップ
	if( substr($0,1,1)=="#" || length($0)==0 ){ next }

# UNIXTIME カラムの取得＆データ分析
	unixtime=$3
	flag_inittime="?"					# 初回 UNIXTIME の識別フラグ（?/T/F）
	if( tbl_u2seq[unixtime]==0 ){		# 初回の日時
		flag_inittime="T"
		seq++							# 値 1 から開始（初期値 0 と区別する為）
		tbl_u2seq[unixtime] = seq		# UNIXTIME に seq 値を登録
	}
	else{								# 既出の日時   （別衛星の同じ時刻     ）
		flag_inittime="F"
	}

# ファイルへの出力（整数５桁の理由）
# > 24[hour]*60[min]*60[sec] = 86400[sec](%5d) ->  1[sec] 刻みで 1日   を表現可能
# > 24[Hz]  *60[sec]*60[min] = 86400[sec](%5d) -> 24[Hz ] 動画で 1時間 を表現可能
	f_cnt = tbl_u2seq[unixtime]			# 出力ファイル名の seq 値
	fname = sprintf( "%05d", f_cnt-1 )	# 値 0 から使用する(整数5桁)

	if( flag_inittime=="F" ){			# 既出の日時   （別衛星の同じ時刻     ）
		print "" > fname				# ２行空ける
		print "" > fname				# ２行空ける
	}

	print $0 > fname					# 現在行をファイル出力
	for( i=0 ; i<size-1 ; i++ ){		# size=N の処理ループ
		getline							# 更に1行ファイル読み込み
#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
	# 途中で｛コメント行｜空行｝を検出したら、現在の処理を打ち切って次に進む（重要）。
	# > 例えば、LoopTick=100*h PlotType=x7 の場合 100/7=14 余り 2 なので、先頭衛星はファイル 00000 ~
	# > 00013 に各 7 行、00014 には 2 行を出力し、続く衛星の処理に移行する必要がある。（以下、同様）
	# > しかし、最後のファイル 00014 はデータセット数が不足するため消去する。
#---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|---+---+---+---+---|
		if( substr($0,1,1)=="#" || length($0)==0 ){
			shell_command = sprintf("%s %s","rm -f",fname)
			system( shell_command )
			next
		}
		print $0 > fname				# 更に1行ファイル出力
	}

}
