並べ替えたい
- ファイル名に基づいています。
- ファイル名の接頭辞が一致し、ファイルが数字で終わる場合は、ファイル名の末尾の数字に基づいて数字でソートしたいと思います。
次のような
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
。一致を取得するには、リストコンテキストが必要です。私たちは最初のゲームに興味があります(他のゲームはありません)。