bashスクリプトを使用して文字列+数値と結合した文字列をソートするにはどうすればよいですか?


27

これは、ソートしたいデータです。しかしsort、数値を文字列に処理し、データは期待どおりにソートされません。

/ home / files / profile1
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

これを並べ替えたい

/ home / files / profile1
/ home / files / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

bashスクリプトによる良い方法はありますか?ここではrubyまたはpythonスクリプトを使用できません。


「ソート-nd」を使用してみてください
ボバ

1
@bobah、「ソート:オプション `-dn 'に互換性がない」
-maxschlepzig

10
sort -Vするだろう。
トール

2
@トール。あなたのコメントは良い答えになるでしょう
Peter.O

回答:


21

一時的な監視文字を使用して、番号を区切ることができます。

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

ここでは、センチネル文字は「;」です。-ソートするファイル名の一部であってはなりません-ただし、「;」は交換できます 好きなキャラクターで。あなたは変更する必要がありsedsortそしてtrそれに応じて、その後の部分。

パイプは次のように機能します。sedコマンドは、番号の前にセンチネルを挿入しsort、センチネルをフィールド区切り文字として解釈し、2番目のフィールドを数値ソートキーとしてソートし、tr再度センチネルを削除します。

またlog、入力ファイルを示します-入力をにパイプすることもできますsed


私はあなたが問題を解決した方法が好きです:)
SHW

44

これはこの質問と非常に類似しています。問題は、ソート対象の英数字フィールドがあり-n、バージョンソート(-V)を使用しても賢明に処理しないことです。したがって、使用:

sort -V

この機能は現在、GNU、FreeBSD、およびOpenBSDのソート実装でサポートされていることに注意してください。


これがどれくらいポータブルか知っていますか?このオプションはPOSIX仕様の一部ではないようです。
アーネストA

@ErnestA:あなたは正しい、これはGNUソート固有のソリューションです。メモを追加しました。
トール

@ErnestA:FreeBSDとOpenBSDがこの機能を追加したようです。
トール

また、数字のプレフィックスが異なる場合は機能しません。
ダンテ

1
読者の皆様へ:これはCAPITAL Vです!sort -Vnotを使用しsort -vます。一目見ただけではわかりません。
ガブリエルステープルズ

7

すべてのファイル名の最後の数値部分の前に同じプレフィックスが付いている場合、並べ替えるときに無視します。

sort -k 1.20n

(20は最初の桁の位置です。1にの長さを加えたものです/home/files/profile。)

複数の異なる非数値パーツがある場合は、センチネルを挿入します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.