web-dev-qa-db-ja.com

共通のプレフィックスとサフィックスを含む文字列をBashから数値で並べ替える方法は?

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

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

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

33
AWE

使用する ls -lv

Manページから:

-v     natural sort of (version) numbers within text
38
Steve

以下を試してください:

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

[〜#〜] demo [〜#〜]

32
João Silva

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

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

# 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

並べ替えで最後の行を最初の行の直後に移動する場所。

2
tripleee

利用可能な場合は、単に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
1
Rhubbarb