www.
URL이 또는 로 시작 하는 경우 m.
해당 부분이 존재하지 않거나 정렬과 관련이 없다고 가정하여 정렬이 수행 되도록 파일의 URL 목록(URL/행 1개)을 정렬하고 싶습니다 . 어떤 제안이 있으십니까?
예
facebook.com###page
fahrrad.de###userlike-popup
m.facebook.com##.cx
www.facebook.com##body
www.fahrrad.de###userlike-footerbar
정렬된 파일은 다음과 같습니다.
www.facebook.com##body
m.facebook.com##.cx
facebook.com###page
www.fahrrad.de###userlike-footerbar
fahrrad.de###userlike-popup
설명하다
facebook.com
fahrrad.de
h 이전의 c보다 우선합니다 .www.facebook.com##body
m.facebook.com##.cx
b
이전 처럼 앞서.
m.facebook.com##.cx
facebook.com###page
.
이전 처럼 앞서#
www.fahrrad.de###userlike-footerbar
fahrrad.de###userlike-popup
f보다 p 앞에 옴
답변1
건너뛰려는 부분 뒤에 언제든지 문자를 추가하고 거기에서 정렬을 시작할 수 있습니다(그런 다음 문자를 제거).
sed
해당 옵션을 지원하는 경우 -E
(최신 버전의 GNU가 sed
이 작업을 수행하고 이전 버전이 대신 이 작업을 수행 -r
하지만 GNU가 아닌 구현에는 이식성이 떨어집니다):
<file sed -E 's/^(www\.|m\.)?/&:/' | sort -t: -k2 | sed 's/://'
awk
또는 다음을 사용하여 동일한 작업을 수행할 수 있습니다 perl
.
<file awk '{sub(/^(www\.|m\.)?/, "&:"); print}' | sort -t: -k2 | sed 's/://'
<file perl -pe 's/^(www\.|m\.)?/$&:/' | sort -t: -k2 | sed 's/://'
POSIX를 사용하더라도 sed
언제든지 다음을 수행할 수 있습니다.
<file sed -e 's/^www\./&:/;t' -e 's/^m\./&:/;t' -e 's/^/:/' |
sort -t: -k2 | sed 's/://'
또는 .
Nor로 시작하지 않는 줄의 시작 부분에 를 추가하고 첫 번째 부분 이후에 부분을 정렬할 수 있습니다.www.
m.
.
<file sed -e '/^www\./b' -e '/^m\./!s/^/./' | sort -t. -k2 | sed 's/^\.//'
답변2
단독으로 사용 perl
:
perl -e 'print sort {$a=~s/^(www|m)\.//r cmp $b=~s/^(www|m)\.//r} <>'
$a
사용자 정의 비교를 지정할 $b
수 있는 Perl의 특수 변수입니다 .sort
s/^(www|m)\.//r
적용하기 전에 입력 줄에서 선행 www.
또는 부분을 제거합니다.m.
sort
<>
이 경우 입력 행 배열이 제공됩니다.
슈워츠 변환변형:
perl -e 'print map { $_->[0] }
sort { $a->[1] cmp $b->[1] or $a->[0] cmp $b->[0] }
map { [$_, s/^(www|m)\.//r] } <>'
마찬가지로 ruby
:
# can golf it to {_1.sub(/^(www|m)\./, "")} on latest version
ruby -e 'puts readlines.sort_by {|s| s.sub(/^(www|m)\./, "")}'
답변3
이것을 살펴보자:
sed 's;^\([wm\.]*\)\(.*\)$;\2 \1\2;' file | sort | awk '{ print $2 }'