이 유용한 스레드 에서 답변을 겪었 지만 문제는 다른 것으로 보입니다 (적어도 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
답변
여기에 몇 가지 방법이있다, 그러나 아무도의 속도에 접근하지 않습니다 cut
및 nl
위의 솔루션 :
-
어 wk
awk -F, '{$1=NR;print $1","$2;}' file.csv > newfile.csv
-
펄
perl -pe 's/[^,]+/$./' file.csv > newfile.csv
또는
perl -F, -ane '$F[0]=$.; print join ",", @F' file.csv
-
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 배 빠릅니다.