예

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.comfahrrad.deh 이전의 c보다 우선합니다 .
  • www.facebook.com##bodym.facebook.com##.cxb이전 처럼 앞서.
  • m.facebook.com##.cxfacebook.com###page.이전 처럼 앞서#
  • www.fahrrad.de###userlike-footerbarfahrrad.de###userlike-popupf보다 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 }'

관련 정보