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
항상 가장 빠른 방법입니다.