[unix] 큰 CSV 파일 재 인덱싱

이 유용한 스레드 에서 답변을 겪었 지만 문제는 다른 것으로 보입니다 (적어도 sed~).

다음과 같은 행이있는 큰 CSV 파일 (200 + GB)이 있습니다.

<alphanumerical_identifier>,<number>

<alphanumerical_identifier>전체 파일에서 고유 한 위치 입니다. 나는 별도의 파일 생성하고자하는 인덱스에 의해 첫 번째 열을 대체 , 즉

<index>,<number>

우리가 얻을 수 있도록 :

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

awk메모리에 전체 파일을로드하지 않고도 증가하는 인덱스를 생성 할 수 있습니까 ?

지수가 단조 증가하기 때문에 지수를 삭제하는 것이 더 좋습니다. 그 해결책이 다를까요?

<number>
<number>
<number>



답변

테스트 할 터미널 근처가 아니라 간과되는 nl명령은 어떻습니까? 다음과 같은 것 :

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


답변

여기에 몇 가지 방법이있다, 그러나 아무도의 속도에 접근하지 않습니다 cutnl위의 솔루션 :

  1. 어 wk

    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 파일을 테스트했으며 2.2282 (awk), 2.4555 (1st perl), 3.1825s (2nd perl) 및 무려 48.6035s를 쉘에 사용했습니다. 당신이 이미 가지고 있는 매우 영리 cut하고 nl해결책은 0.6078에서 약 4 배 빠릅니다.


답변