ファイルのリストは次のとおりです。
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
今度はそれを数値的に分類したいと思います。 * 23 *で始まり* 102 *で終わる。
私が試してみました -n
および-g
。 -t
は、これらの乱雑な文字列には役立ちません。
オプションを使用して数値の先頭の文字列を無視することはできますか、それとも賢くスクリプトを使用する必要がありますか?
使用する ls -lv
Manページから:
-v natural sort of (version) numbers within text
一般的なケースでは、 シュワルツ変換 を試してください。
簡単に言うと、数値を独自のフィールドに分割して並べ替え、追加したフィールドを破棄します。
# In many shells, use ctrl-v tab to insert a literal tab after the first \2
sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2 \1\2/' file |
sort -n |
cut -f2-
これは、次の入力のように、入力に明確なセパレータがない場合にうまく機能します。
abc1
abc10
abc2
並べ替えで最後の行を最初の行の直後に移動する場所。
利用可能な場合は、単にsort -V
。これはバージョン番号の並べ替えですが、「自然な並べ替え」オプションとして機能します。
$ ff=$( echo some.string_{100,101,102,23,24,25}_with_numbers.in-it.txt )
並べ替えなし:
$ for f in $ff ; do echo $f ; done
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
Sort -Vを使用:
$ for f in $ff ; do echo $f ; done | sort -V
some.string_23_with_numbers.in-it.txt
some.string_24_with_numbers.in-it.txt
some.string_25_with_numbers.in-it.txt
some.string_100_with_numbers.in-it.txt
some.string_101_with_numbers.in-it.txt
some.string_102_with_numbers.in-it.txt