셸에서만 CSV를 숫자로 나눕니다.

5420 단어 linuxbashbeginners
  • 때때로 대용량 CSV 파일을 처리해야 합니다.
  • 이 경우 미리 나누어서 폴더를 만들어 두면 처리가 용이합니다.
  • 이 섹션에서는 Shell만 사용하여 파일을 분할하고 줄 수에 따라 폴더를 분류하는 방법을 설명합니다.

  • 결과


  • 다음은 실행 전 디렉토리 구조이다.

  • .
    ├── sample.csv
    ├── main.sh
    


  • 다음은 main.sh에 대한 설명입니다.
  • sample.csv에 100개의 데이터 행이 있습니다.

  • ※오류 처리는 생략합니다.


  • #!/bin/sh
    set -e
    
    # file path
    [ ! -e "$1" ] && exit 1 || datafile="$1"
    # File extension deletion
    filename="${datafile%.*}"
    # Get number of lines
    row=$(grep -c '' $datafile)
    # Obtaining the number of splits
    sep="$2"
    # Number of directories created
    dir_cnt=$(awk -v row="$row" -v sep="$sep" 'BEGIN {
        i=row/sep
        printf("%d\n",i+=i<0?0:0.999)
        }
        '
    )
    # Folder creation
    seq -f "${filename}_%01.0f" 1 ${dir_cnt} |
    xargs mkdir -p
    # File division
    split -l ${sep} -a 2 $datafile "${filename}_"
    # File movement
    count=1
    for i in `find . -type f -name "${filename}_*" | sort`
    do
        mv $i "${filename}_${count}/${i//_*/_${count}}.csv"
        let count++
    done
    


  • 다음과 같이 실행합니다.

  • sh main.sh sample.csv 25
    


  • 실행 후 디렉토리 구조가 다음과 같은지 확인한다.

  • .
    ├── main.sh
    ├── sample.csv
    ├── sample_1
    │   ├── sample_1.csv
    ├── sample_2
    │   ├── sample_2.csv
    ├── sample_3
    │   ├── sample3.csv
    ├── sample_4
    │   ├── sample4.csv
    


    보충



    생성된 디렉토리 수



  • 반올림
  • 100/15와 같은 십진수의 경우 디렉토리가 정상적으로 생성되지 않는다.
  • printf 를 사용하여 정수로 반올림합니다.


  • 파일 분할 및 이동



  • 확장자는 mv에 의해 추가됩니다.
  • 분할의 추가 확장자( --additional-suffix )가 Mac 등에서 기본값이 아닙니다.


  • 링크


  • split
  • https://unix.stackexchange.com/questions/32626/split-a-file-by-line-and-have-control-over-resulting-files-extension
  • 좋은 웹페이지 즐겨찾기