대용량 CSV 파일의 색인을 다시 생성합니다.

대용량 CSV 파일의 색인을 다시 생성합니다.

다음 답변을 찾아보았습니다.이 유용한 스레드, 그러나 내 문제는 충분히 달라서 좋은 대답을 생각할 수 없습니다(적어도 sed).

다음과 같은 행이 포함된 대용량 CSV 파일(200GB 이상)이 있습니다.

<alphanumerical_identifier>,<number>

여기서는 <alphanumerical_identifier>전체 파일에서 고유합니다. 별도의 파일을 만들고 싶습니다.첫 번째 열을 인덱스로 교체, 즉.

<index>,<number>

그래서 우리는 다음을 얻습니다:

1, <number>
2, <number>
3, <number>

awk전체 파일을 메모리에 로드하지 않고 증분 색인을 생성 할 수 있습니까 ?

인덱스는 단조롭게 증가하므로 인덱스를 삭제하는 것이 더 나을 수도 있습니다. 해결책은 다를까요? 지금 바로:

<number>
<number>
<number>

답변1

터미널 근처에서 테스트하지 않지만 종종 간과되는 명령 nl은 어떻습니까 ? 그것은 다음과 같습니다:

cut -f 2 -d , original.csv | nl -w 1 -p -s , > numbered.csv

답변2

여기에는 몇 가지 방법이 있지만 cut위의 솔루션만큼 빠른 방법은 없습니다.nl

  1. awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
    
  2. 진주

    perl -pe 's/[^,]+/$./' file.csv > newfile.csv
    

    또는

    perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
    
  3. Shell (단, 200G 파일에는 시간이 오래 걸리므로 권장하지 않습니다)

    i=1; while IFS=, read foo num; do 
            printf "%d,%s\n" $((i++)) $num; 
    done < file.csv > newfile.csv
    

위의 솔루션은 속도 순으로 정렬되었습니다. 내 노트북과 40M 파일로 테스트했는데 결과는 (평균 10회 실행) 2.2282(awk), 2.4555(1st perl), 3.1825초(2nd perl)이었고 쉘은 놀라웠어요. 48.6035초가 걸렸습니다. 이미 가지고 있는 매우 영리한 cut솔루션은 nl0.6078초로 약 4배 더 빠릅니다.

관련 정보