web-dev-qa-db-ja.com

bashで、数字を含む文字列を並べ替える方法は?

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

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

しかし、私の並べ替えが間違っているため、それは機能しません。

38
ngm

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

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

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

sort --version-sort

この特定の例では、これを行うこともできます。

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

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

31
larsks

-v GNU lsのオプション:テキスト内の(バージョン)番号の自然な種類。

ls -1v cwcch*

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

コマンドラインで直接シェル展開を使用します。拡張では、それらを適切に順序付ける必要があります。 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
quack quixote

ソートを使用する方法は次のとおりです。

ls | sort -k1.6n
2
Scot

ソート-g 昇順で番号を並べ替えるために使用されます。

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


次の1つのライナーは、PDFファイルの名前を持つファイルを反復処理し、 egrep -o そして使用 ソート-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
0
Aguevara