bashでは、数字を含む文字列をソートする方法は?


37

これらのファイルがディレクトリにある場合

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf

どうすれば文字列の数字部分に基づいて昇順の数字順になるようにそれらをBashにリストできますか。したがって、結果の順序はcwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdfなどです。

最終的に私がやろうとしているのは、pdfをpdftk次のようなものと連結することです

pdftk `ls *.pdf | sort -n` cat output output.pdf

しかし、私のソートが間違っているので、それは機能しません。


これに対するすべての素晴らしい答えをありがとう。Unixの場合と同様に、この猫の皮を剥ぐためのさまざまな優れた方法があります。
ngm 2009

回答:


7

このようなものはあなたが望むことをするかもしれませんが、少し異なるアプローチを取ります:

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf

あ、いいアプローチだ!確かに私が何をするのか、感謝します。
ngm 09

62

あなたsortはあなたのためにこれを行う能力を持っているかもしれません:

sort --version-sort

ソートmanページの関連エントリの抜粋: -V, --version-sort natural sort of (version) numbers within text
-panmari

これが必要なものです。しかし、あなたのソートは、このオプションは、この記事を見てみましょ供給しない場合:stackoverflow.com/a/4495368/1240018
eventhorizo​​n

30

この特定の例では、これも実行できます。

ls *.pdf | sort -k2 -th -n

つまり、フィールド区切り文字(-th)として「h」を使用して、2番目のフィールド(-k2)で数値(-n)でソートします。


分割してから1つのフィールドで並べ替えます。これは素晴らしいヒントであり、今後便利になると確信しています。
ngm 2009

6

-vGNUでオプションを使用できますls:テキスト内の自然なソート(バージョン)番号。

ls -1v cwcch*

これはls-vオプションの意味が異なるBSD (OS Xなど)では機能しません。


これは最も単純なソリューションであり、より多くの賛成票が必要です!
davidparks21

2

コマンドラインでシェル拡張を直接使用します。拡張により、適切に順序付けられます。pdftkのコマンドライン構文を適切に理解している場合、これはあなたが望むことをします:

# shell expansion with square brackets
pdftk cwcch[1-9].pdf cwcch1[0-9].pdf cat output output.pdf

# shell expansion with curly braces
pdftk cwcch{{1..9},{10..18}}.pdf cat output output.pdf

または、別のアプローチを試すことができます。このようなことをする必要があるとき、私は通常、事前に適切にフォーマットされた番号を取得しようとします。私が遅く来て、あなたの例のようにPDFにすでに番号が付けられている場合、これを使用して番号を付け直します:

# rename is rename.pl aka prename -- perl rename script
# this adds a leading zero to single-digit numbers
rename 's/(\d)/0$1/' cwcch[1-9].pdf

これで、標準のls並べ替えが適切に機能します。


2
おそらくもう少し簡潔に:pdftk cwcch{{1..9},{10..18}}.pdf ...
さらに通知があるまで一時停止します。

追加された良いヒントは、標準のBourneシェル拡張構文またはbash拡張機能ですか?
いんちきのキホーテ2009


0

ソート-gは、数値を昇順でソートするために使用されます。

anthony@mtt3:~$ sort --help | egrep "\-g"
-g, --general-numeric-sort  compare according to general numerical value


次の1つのライナーは、PDFファイルの名前を使用してファイルを反復処理し、egrep -oでのみ番号を取得し、sort -gを使用して番号を昇順で並べ替えます。次に、これらの番号をsedにフィードしてプラグインします。次に、uniqを使用して重複の出力を取り除きます。


uniqの代わりに、awkも使用できます。

awk '!x[$0]++'

上記はuniqと同等です。


あなたが探しているのはこのライナーです:

for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done


tmpの内容:

anthony@mtt3:~$ cat tmp
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf 

編集:

コマンドの出力:

anthony@mtt3:~$ for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf

、この上の1つのライナー作業tmpファイルを?答えに貼り付ける出力はありますか?
Xen2050

はい。OPの編集セクションの下に出力を含めました。
アグヴァーラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.