Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

逆引き順(reverse index)で文字列をソートする

注意事項

逆順(reverse order)でなく逆引き順(reverse index)であることに注意。また日本語の「逆引き」は、文字列の先頭と末尾を逆にした並び(reverse index)の意味と、意味から単語を探す(reverse lookup)の意味の両方で使われる。ここではreverse indexの意味で「逆引き」を使う。

背景

uBlacklistGoogleの検索結果からStack Overflowの機械翻訳サイトを除外している。

ここで、手作業による除外サイトの追加を減らすため、Stack Overflowの機械翻訳サイトの除外用フィルタをuBlacklistの機能で購読することにした。それに伴い、これまで手作業で追加した除外サイトのリストから、購読するリストでカバーされているものを削除することにした。

ただし、手作業で追加したリストの中にはホスト名部分を「*」で指定しているものもある。そのようなサイトがあった場合に目grepでの抽出・削除を容易にするため、手元のURLリストと購読するリストを合わせて逆引き順(reverse index)でソートしたい(たとえば、ja.wikipedia.orgと*.wikipedia.orgが隣に来るように文字列をソートしたい)。

方法

revで文字列を逆引き順にしてからsortし、再度revで文字列の順を戻す。手元のURLリストをuser.txt、購読するリストをuBlacklist.txtとすると以下のようになる。

cat user.txt uBlacklist.txt | rev | sort | uniq | rev

応用

手元のURLリストをuser.txt、購読するリストをuBlacklist.txtとすると、以下のコマンドで購読するリストでカバーされているURLを削除できる。uniqコマンドで差集合を取る方法についてはuniq コマンドと集合演算を参照。

cat user.txt uBlacklist.txt uBlacklist.txt | rev | sort | uniq -u | rev

注意事項

rev(1)はPOSIXにもSysVににも含まれない。

  • Linuxではrev(1)はutil-linuxパッケージに入っているため、多くのディストリビューションではデフォルトインストールで問題なく利用できると思われる。
  • FreeBSDのrev(1)はどのパッケージに入っているか分からなかった*1
  • AIXでもrev(1)は使える模様*2。デフォルトインストール以外に必要な作業があるかは不明。