はい

はい

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カスタム比較を指定できる$bPerlの特殊変数です。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 }'

関連情報