
シェルスクリプトを使用してCSVに変換する必要がある次の形式のMapReduce出力ファイルがあります。動的値は、トランザクションIDである5つの値とそれに続く4つのフィールド(2000、ABC corp、..、BE900000075000027)で、次のトランザクションIDに対して引き続き変更され、他の値は17のみです。 (25-5月-15)、04:20~標準寿命まで)は一定です。
25-MAY-15
04:20
Client
0000000010
127.0.0.1
PAY
ISO20022
PAIN000
100
1
CUST
API
ABF07
ABC03_LIFE.xml
AFF07/LIFE
100000
Standard Life
================================================
================================================
AFF07-B000001
2000
ABC Corp
..
BE900000075000027
AFF07-B000002
2000
XYZ corp
..
BE900000075000027
AFF07-B000003
2000
3MM corp
..
BE900000075000027
次の形式の出力が必要です。
25-MAY-15,04:20,Client,0000000010,127.0.0.1,PAY,ISO2002,PAIN000,100,1,CUST,API,ABF07,ABC03_LIFE.xml,AFF07/LIFE,100000,Standard Life, 25-MAY-15,04:20,Client,0000000010,127.0.0.1,PAY,ISO2002,PAIN000,100,1,CUST,API,AFF07-B000001, 2000,ABC Corp,..,BE900000075000027
25-MAY-15,04:20,Client,0000000010,127.0.0.1,PAY,ISO2002,PAIN000,100,1,CUST,API,ABF07,ABC03_LIFE.xml,AFF07/LIFE,100000,Standard Life, 25-MAY-15,04:20,Client,0000000010,127.0.0.1,PAY,ISO2002,PAIN000,100,1,CUST,API,AFF07-B000002,2000,XYZ Corp,..,BE900000075000027
2つの破線の前の値とトランザクションID AFF07-B000001、AFF07-B000002、AFF07-B000003の残りの出力を繰り返す必要があります。実際のファイルには破線がなく、入力ファイルの理解を助けるために追加しました。
答え1
繰り返すフィールドが5つあるとし、次のawkを使用します。
BEGIN { header=1 ; }
length($0) == 0 { header=0 }
length($0) > 0 {
if ( header ) { str_h= str_h "," $0 ;}
else {
str_f = str_f "," $0 ;
c++ ;
if ( c == 5 ) {
printf "%s%s\n",substr(str_h,2),str_f ;
c = 0 ;
str_f = "" ;
}
}
}