awk, sed 또는 다른 것을 사용하여 대용량 파일에서 줄을 효율적으로 인쇄하는 방법은 무엇입니까? [복사]

awk, sed 또는 다른 것을 사용하여 대용량 파일에서 줄을 효율적으로 인쇄하는 방법은 무엇입니까? [복사]

800만 줄이 포함된 일반 텍스트 파일이 있고 4,000,010에서 4,000,000줄을 화면에 인쇄하려는 경우 awk 또는 sed 중 어느 것이 더 효율적일까요?

텍스트에는 스키마가 없으며 불행히도 데이터베이스는 옵션이 아닙니다. 나는 이것이 이상적이지 않다는 것을 알고 있습니다. 누가 더 빨리 완료할 수 있는지 궁금합니다.

아니면 sed나 awk에 대한 더 나은 대안이 있을까요?

답변1

둘 다 tail또는 head대신 다음을 사용하십시오.

$ time tail -n 4000001 foo | head -n 11
real    0m0.039s
user    0m0.032s
sys     0m0.004s

$ time head -n 4000010 foo | tail -n 11
real    0m0.055s
user    0m0.064s
sys     0m0.036s

tail사실 항상 더 빠릅니다. 이 두 명령을 100번 실행하고 평균을 계산합니다.

꼬리:

real    0.03962
user    0.02956
sys     0.01456

머리:

real    0.06284
user    0.07356
sys     0.07244

tail4e10 줄까지 쭉 봐야 하지만 거기에 도달할 때까지 실제로 아무것도 인쇄하지 않고 head4e10+10 줄까지 모든 것을 인쇄하기 때문에 더 빠르다고 생각합니다 .


다른 연대순 정렬 방법과 비교:

sed:

$ time sed -n 4000000,4000011p;q foo
real    0m0.312s
user    0m0.236s
sys     0m0.072s

진주:

$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo 
real    0m1.000s
user    0m0.936s
sys     0m0.064s

이상한:

$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo 
real    0m0.955s
user    0m0.868s
sys     0m0.080s

기본적으로 규칙은 구문 분석을 적게 할수록 속도가 빨라진다는 것입니다. 입력을 (이전과 마찬가지로) 화면에 인쇄하기만 하면 되는 데이터 스트림으로 처리하는 것이 tail항상 가장 빠른 접근 방식입니다.

관련 정보