다음 답변을 찾아보았습니다.이 유용한 스레드, 그러나 내 문제는 충분히 달라서 좋은 대답을 생각할 수 없습니다(적어도 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
앗
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 파일로 테스트했는데 결과는 (평균 10회 실행) 2.2282(awk), 2.4555(1st perl), 3.1825초(2nd perl)이었고 쉘은 놀라웠어요. 48.6035초가 걸렸습니다. 이미 가지고 있는 매우 영리한 cut
솔루션은 nl
0.6078초로 약 4배 더 빠릅니다.