ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 Shell2 - file merge, split
    Infra 2021. 5. 15. 19:30

    파일처리가 밀려 대량의 파일을 처리해야는경우 작업속도를 위해 파일들을 병합(merge), 분할(split) 해야하는 일이 생겼습니다. 이를 위한 쉘을 만들어봤습니다.

    작업순서

    1. 대상파일 목록 저장 -> 배열
      • 파악한 대상은 임시폴더로 이관
    2. 원본파일들을 작업경로 복사
    3. 원본파일 데이터들을 하나의 파일로 병합
      • 데이터 건수비교, 맞으면 복사해온 원본파일 삭제 (용량 정리)
    4. 병합한 파일을 레코드 수 기준으로 분할
    5. 처리가능한 파일명으로 변환
      • 파일의 정상생성을 알리는 .FIN파일 생성
    6. 최종 경로로 복사

    경로

    • src1 : 변환된 파일 저장경로 (대상파일목록 수집경로)
    • src2 : 원본파일 보관경로
    • mns : 파일병합 및 분할 작업 경로
    • tgt : 결과파일 저장 경로

    Shell Script 작성

    필요한 기능과 작업순서를 고려해서 작성했지만 개선해야할 부분들이 많습니다. 예를들면 분할이 정상적으로 이뤄졌는지 데이터 비교가 필요하고 그 외 예외적인 경우를 방지하는 부분들을 추가해야합니다. 또한 반복적으로 사용하는 값들도 하나의 변수에 등록하고 사용하는 등 많은데 차차 개선해보려고 합니다.

    쉘파일 생성

    vi test.sh
    chmod +rx test.sh
    
    #실행 (파라미터로 병합할 파일 일자 입력)
    ./test.sh yyyymmdd

    초기 설정값 등록

    #!/bin/bash
    
    dir_src1='/home/admin/src1/'
    dir_src2='/home/admin/src2/'
    dir_mns='/home/admin/mns/'
    dir_tgt='/home/admin/tgt/'
    
    date=$1
    

    대상파일 수집 (파일목록 수집 및 대상 복사)

    
    #colec file_list
    cd $dir_src1
    file_list=`ls *${date}*.DAT | sort`
    
    for item in ${file_list[@]}
    do
            echo $item
            echo ${item:4:8}
    done
    
    #copy origin files
    cd $dir_src2
    for item in ${file_list[@]}
    do
    
            #일자별 파일분리
            if [ ! -d ./$date ]
            then
                    mkdir ./$date
            fi
    
            #일자별 파일 분리
            if [ ! -d ${dir_mns}${date} ]
            then
                    mkdir ${dir_mns}${date}
            fi
    
            cp $item ${dir_mns}${date}
            mv $item ${dir_src2}${date}
    done
    

    파일병합

    • .MRG라는 하나의 파일로 파일병합
    • 원본파일 데이터 건수와 병합파일 데이터 건수 확인 (맞으면 복사해온 원본파일 삭제 - 불필요)
    
    #file merge
    cd ${dir_mns}${date}
    ls *${date}*.DAT | sort | xargs cat > D1_T${date}.MRG
    
    orgin_rec_cnt=`cat *${date}*.DAT |wc -l`
    mrg_rec_cnt=`cat *${date}*.MRG |wc -l`
    
    if [ $orgin_rec_cnt -ne $mrg_rec_cnt ]
    then
            echo 'file_merge error'
            exit 1;
    else
            rm -rf *${date}*.DAT
    fi
    

    파일분할 및 FIN파일생성

    • 파일처리과정에서 .FIN 확장자 파일이 존재할 경우 .DAT파일을 처리하는 구조
    • 그래서 .FIN파일을 생성
    
    #file split
    split -d -a 4 -l 3 D1_T${date}.MRG ../D1_T${date}.DAT_
    
    #rename DAT file & touch FIN
    cd ${dir_mns}
    file_list=`ls D1_*${date}*.DAT_* | sort`
    
    for item in ${file_list[@]}
    do
            idx=${item:17:4}
            time=`date +'%H%M%S'`
            echo ${idx}
            echo ${time}
            mv ${item} D1_${idx}_T${date}${time}.DAT
            touch D1_${idx}_T${date}${time}.FIN
    done
    

    분할된 파일 타겟경로로 이관

    
    #send files to tgt_dir
    mv D1_*_T${date}*.DAT ${dir_tgt}
    mv D1_*_T${date}*.FIN ${dir_tgt}
    
    
    echo done
    

    댓글

Paycis's