36

ファイルのリストは次のとおりです。

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これらの厄介な文字列には役立ちません。

オプション付きの数字の先頭の文字列を無視できますか、それとも賢くてスクリプトである必要がありますか?

4

4 に答える 4

44

使用するls -lv

マニュアルページから:

-v     natural sort of (version) numbers within text
于 2012-10-26T14:06:13.710 に答える
36

次のことを試してください。

sort -t '_' -k 2n
  • -t '_'(区切り文字を下線文字に設定します)
  • -k 2n(番号順を使用して2番目の列でソートします)

デモ

于 2012-10-26T14:06:34.063 に答える
6

可能な場合は、を使用して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

ソート-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
于 2018-02-19T15:14:37.810 に答える
3

一般的なケースでは、シュワルツ変換を試してください。

簡単に説明すると、数値を独自のフィールドに分割し、それを並べ替えて、追加されたフィールドを破棄します。

# 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

ソートで最後の行を最初の行の直後に移動する場所。

于 2016-09-15T08:04:43.640 に答える