複数列のアルファベットと数字の並べ替え

複数列のアルファベットと数字の並べ替え

並べ替えたい

  1. ファイル名に基づいています。
  2. ファイル名の接頭辞が一致し、ファイルが数字で終わる場合は、ファイル名の末尾の数字に基づいて数字でソートしたいと思います。

次のような

cat /tmp/foo.txt | sort -t/ -k3,3 -k3,3n

1は完成しましたが、2は完成できませんでした。

入力する/tmp/foo.txt

dirA/catA/apple.txt
dirA/catA/addition.txt
dirA/catA/difference
dirA/catB/binary.txt
dirA/catB/carry.txt
dirA/catB/digit
dirA/catC/test-10.txt
dirA/catC/test-100.txt
dirA/catC/test-1000.txt
dirA/catC/test-11.txt
dirA/catC/test-2.txt
dirA/catC/test-20.txt
dirA/catC/test-25.txt
dirA/catC/test-5.txt
dirA/catC/test-50.txt
dirA/catC/test-500.txt
dirA/catC/test-7.txt
dirA/catC/test-75.txt
dirA/catC/test-8.txt
dirA/catC/abc-test-9.txt
dirA/catC/abc-test-999.txt
dirA/catC/abc-test-75.txt
dirA/catC/abc-test-8.txt

希望の出力

dirA/catC/abc-test-8.txt
dirA/catC/abc-test-9.txt
dirA/catC/abc-test-75.txt
dirA/catC/abc-test-999.txt
dirA/catA/addition.txt
dirA/catA/apple.txt
dirA/catB/binary.txt
dirA/catB/carry.txt
dirA/catA/difference
dirA/catB/digit
dirA/catC/test-2.txt
dirA/catC/test-5.txt
dirA/catC/test-7.txt
dirA/catC/test-8.txt
dirA/catC/test-10.txt
dirA/catC/test-11.txt
dirA/catC/test-20.txt
dirA/catC/test-25.txt
dirA/catC/test-50.txt
dirA/catC/test-75.txt
dirA/catC/test-100.txt
dirA/catC/test-500.txt
dirA/catC/test-1000.txt

ベストアンサー1

Perlが救出に来る!

perl -e '
    print for sort { (($a =~ m{.*/([^0-9]*)})[0] cmp ($b =~ m{.*/([^0-9]*)})[0])
                     ||
                     (($a =~ /-([0-9]+)/)[0] <=> ($b =~ /-([0-9]+)/)[0]) } <>
' -- /tmp/foo.txt
  • <>入力ラインを読む
  • タイプ与えられたコードに基づいてリストをソートします。
  • m{.*/([^0-9]*)}デフォルト名がある場合は、最大1つの数字まで抽出します。
  • cmp文字列比較の実行
  • 同じ場合、ORは||2番目の比較を適用します。
  • /-([0-9]+)/数値抽出
  • <=>数値比較
  • (...)[0]matchは一致リスト(などに対応)を返すため、この設定が$1必要です$2。一致を取得するには、リストコンテキストが必要です。私たちは最初のゲームに興味があります(他のゲームはありません)。

おすすめ記事