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
tail
4e10 줄까지 쭉 봐야 하지만 거기에 도달할 때까지 실제로 아무것도 인쇄하지 않고 head
4e10+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
항상 가장 빠른 접근 방식입니다.