linux – bashで、数字を含む文字列を並べ替えるには?

bash linux sorting

これらのファイルをディレクトリに入れておけば

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

文字列の数字部分に基づいて昇順に並べるにはどうすればいいのでしょうか?その結果、cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdfなどのようになります

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

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

が、私のソートが間違っているのでうまくいきません

  38  None  2009-12-06


ベストアンサー

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

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

8  retracile  2009-12-06


あなたのsortにはその能力があるかもしれません

sort --version-sort

65  Paused until further notice.  2009-12-06


この特定の例では、このようにすることもできます

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

つまり、’h’をフィールドの区切り文字(-th)として、第2フィールド(-k2)上で数値的に(-n)ソートします

32  larsks  2009-12-06


GNU ls: テキスト内の(バージョンの)数値の自然なソート

ls -1v cwcch*

これは BSD ls (例: OS X) では動作しません

7  Ashutosh Vishwa Bandhu  2013-08-20


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


ソートを使っただけの方法をご紹介します

ls | sort -k1.6n

2  Scot  2014-10-15


Sort -g は、数値を昇順に並べ替えるために使用します

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

次のワンライナーは、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

EDIT:

コマンドの出力:

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  2015-11-30


タイトルとURLをコピーしました