큰 CSV 파일 재 인덱싱


11

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

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

<alphanumerical_identifier>,<number>

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

<index>,<number>

우리가 얻을 수 있도록 :

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

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

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

<number>
<number>
<number>

이 솔루션의 가능성에 대해 잘 모르겠습니다. 그러나 별도의 파일로 CSV 파일에서와 같이 많은 수를 생성 한 다음 CSV 파일의 두 번째 열을 해당 파일에 추가하는 것은 어떻습니까?
Ramesh

@Ramesh 출력이 정확하다면 완벽합니다.
Amelio Vazquez-Reina

2
나는 내가 무언가를 오해하고 있다고 생각한다. 그렇지 않으면 awk -F, '{print ++n, $2}'작동합니다. 또는 awk -F, '{print $2}'두 번째 변형입니다.
G-Man, 'Reinstate

2
@ G-Man, 아마 그 FNR뿐만 아니라 서비스를 제공 ++n
하겠지만

1
나는 당신이 정말로 그 Uniq Identifier를 제거 할 수 있는지 세 번 확인하고 ... 인덱스로 첫 번째 (3) 열을 추가하지만 식별자를 계속 유지하는 이유는 무엇입니까? 그 식별자가 다른 곳에서 사용되지 않습니까?
Olivier Dulac

답변:


13

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

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


1
PS : 200GB CSV 파일? 와우, 저는 북미 포트 번호 데이터베이스를 CSV (두 개의 DVD)로 작업하는 것이 엄청나다고 생각했습니다!
감독 19

1
숫자 뒤에 큰 공백이 있지만 작동합니다. : 나는 그것을 대체 할 것이다cut -d, -f 2- /tmp/aa | nl -w 1 -p -s ,
앙헬

@Angel : 감사 -w 1합니다. 왼쪽 번호 대신 너비 옵션을 사용하도록 답변을 업데이트했습니다 .
감독

감사합니다 @bishop-입력 및 출력 파일 이름은 어디에 있습니까?
Amelio Vazquez-Reina

1
@ user815423426 예, cut파이프 기호 ( |) 앞 의 명령 은 두 번째 열만 제공하므로 효과적으로 암시 적 줄 번호를 갖습니다.
주교

7

여기에 몇 가지 방법이있다, 그러나 아무도의 속도에 접근하지 않습니다 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 배 빠릅니다.


좋은 통계 감사합니다! 쉘 결과는 다소 놀랍습니다. 당신이 교체하는 경우 printfecho, 타이밍이 크게 향상합니까?
감독

2
40G 파일이 2.2282 초 내에 처리 되었습니까? 노트북은 어디서 구할 수 있습니까?
John B

2
@JohnB 음, 그래, 미안, 그건 40M이 아니라 G :)
terdon

$1와의 접근 방식 재설정이 마음에 듭니다 awk. cut솔루션은 훨씬 더 빨리 확실히이지만 대체하지 않는 한 그것은 예상 할 수있어 <alphanumerical_identifier>아무것도. 가장 빠른 awk변형은 다음과 같습니다 mawk 'BEGIN{FS=OFS=","}{$1=NR}1' file.csv > newfile.csv.
John B

@JohnB 아, 그렇습니다. OFS명시 적으로 인쇄 하는 대신 사용 하는 ,것이 약간 빠르며 거대한 파일에서 큰 차이가 발생할 수 있습니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.