#!/usr/bin/env python
#coding: utf-8
# 
# yarr 横アレー: レコードをフィールドへ変換（Open usp Tukubai版）
#
# designed by Nobuaki Tounaka
# written by Ryuichi Ueda
#
# The MIT License
#
# Copyright (C) 2011 Universal Shell Programming Laboratory
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

_usage = "yarr [num=<n>] [-<m>] <file>"
_version = "Sun Apr  8 18:00:28 JST 2012"
_code = "Open usp Tukubai (LINUX+FREEBSD/PYTHON2.4+, 3.1, 3.2/UTF-8)"

import re
import os
import sys
import codecs

class Operator:
	def __init__(self):
		self.key_num = 0
		self.return_num = None
		self.hold_values = []
		self.hold_keys = []
		self.value_delimiter = ' '

	def setKeyNum(self,num):
		self.key_num = int(num)
		if self.key_num < 0:
			die("キー範囲指定に誤りがあります。")

	def setReturnNum(self,num):
		self.return_num = int(num)
		if self.return_num <= 0:
			die("数字指定に誤りがあります。")

	def setValueDelimiter(self,str):
		self.value_delimiter = str

	def output(self,tokens):
		keys = tokens[0:self.key_num]
		values = tokens[self.key_num:]

		if arrayEqual(self.hold_keys,keys):
			self.hold_values += values
		else:
			self.flush()
			self.hold_keys = keys
			self.hold_values = values
			
	def flush(self):
		if len(self.hold_values) == 0: return

		if self.return_num == None:
			keystr = " ".join(self.hold_keys)
			valstr = self.value_delimiter.join(self.hold_values)

			outstr = " ".join([keystr,valstr])
			x = outstr.lstrip(' ')
			print(x)
			return
		
		n = 0
		while n < len(self.hold_values):
			m = n + self.return_num
			#指定列数を超えた場合は打ち切る
			if m >= len(self.hold_values): m = len(self.hold_values)

			if len(self.hold_keys) != 0:
				tmp = self.value_delimiter.join(self.hold_values[n:m])
				outstr = self.hold_keys + [tmp]
			else:
				outstr = self.hold_values[n:m]

			print(" ".join(outstr))

			n += self.return_num

		
	def debugPrint(self):
		print(self.key_num, self.return_num)

def eprint(message):
	sys.stderr.write(message)

def die(message):
	sys.stderr.write("Error[yarr] : %s\n" % message)
	sys.exit(1)

def printUsage():
	sys.stderr.write("Usage    : %s\n" % _usage)
	sys.stderr.write("Version  : %s\n" % _version)
	sys.stderr.write("	  %s\n"% _code)
	sys.exit(1)

def arrayEqual(array1,array2):
	if len(array1) != len(array2):	return False

	for i in range(len(array1)):
		if array1[i] != array2[i]:
			return False

	return True

def prefixEqual(prefix,token):
	if len(prefix) > len(token):	return False
	
	p = token[0:len(prefix)]
	if p == prefix:	return True

	return False

def getInFile(file_name):
	if file_name != "-":
		return codecs.open(arg,'r','utf-8')

	#choice of stdin
	if sys.version_info[0] < 3:
		return codecs.getreader('utf-8')(sys.stdin)

	return codecs.getreader('utf-8')(sys.stdin.detach())

def resetStdout():
	if sys.version_info[0] < 3:
		return codecs.getwriter('utf-8')(sys.stdout)

	return codecs.getwriter('utf-8')(sys.stdout.detach())

###########################################
#メイン関数
###########################################
if __name__ == '__main__':
	
	###########################################
	#ヘルプ
	if len(sys.argv) > 1:
		if sys.argv[1] == '--help' or sys.argv[1] == '--version':
			printUsage()

	###########################################
	#処理クラスの準備とオプションの処理
	op = Operator()

	in_file_name = "-"

	argc = len(sys.argv)
	#ファイルか、num=か、-nか
	for i in range(1, argc):
		arg = sys.argv[i]
		if prefixEqual("-d",arg):	op.setValueDelimiter(arg[2:])
		elif arg == "-":		pass
		elif prefixEqual("-",arg):	op.setReturnNum(arg[1:])
		elif prefixEqual("num=",arg):	op.setKeyNum(arg[4:])
		else:				in_file_name = arg

	in_file = getInFile(in_file_name)
	sys.stdout = resetStdout()

	###########################################
	#出力
	for line in in_file:
		line = line.rstrip()
		tokens = line.split(' ')
		op.output(tokens)

	op.flush()
