왜 이런거야?
sed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' > filename.txt
이것보다 빠르나요?
sed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' > filename.txt
내가 실행해 보면 거의 똑같은 일을 하는 것처럼 보이지만, 다른 것보다 더 빠르게 만드는 내부적으로 실제로 변화하는 것은 무엇일까요?
고쳐 쓰다: 버전: (GNU sed) 4.4 입력 데이터 크기: 12GB
답변1
첫 번째 호출은 정규식을 주소 범위로 사용하여 선택된 행 집합에 sed
바꾸기 명령( )을 적용하는 것입니다 .s
두 번째 호출은 첫 번째 호출과 동일한 대체를 적용하지만 주소 범위를 사용하지 않고 입력 데이터의 모든 행에 적용됩니다.
225MiB 이메일 아카이브에서 테스트되었습니다.
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' >/dev/null
real 1m0,39s
user 0m49,69s
sys 0m10,53s
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' >/dev/null
real 0m40,79s
user 0m34,02s
sys 0m7,85s
나는 그것을 몇 번이나 실행했다. 제공된 시간은 대표적인 시간입니다.
보시다시피 나는 얻습니다.반대당신이 얻는다고 주장하는 결과. 이는 데이터 때문일 수 있습니다. sed
동일한 데이터에서 OpenBSD를 테스트할 때(GNU 전용이므로 약간 수정된 표현식 사용) 비슷한 결과를 얻었지만 sed
시간 차이는 더 작습니다.