쉘 스크립트를 사용하여 열 기반 파일을 CSV 출력으로 변환

쉘 스크립트를 사용하여 열 기반 파일을 CSV 출력으로 변환

쉘 스크립트를 사용하여 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

두 개의 점선 앞의 값과 트랜잭션 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 = "" ;
            }
         }
}

관련 정보