web-dev-qa-db-ja.com

ファイルを順にバッシュしてソートする

以前のbashスクリプトを使用して、ファイルのリストを作成しました。

data_1_box
data_2_box
...
data_10_box
...
data_99_box

問題は、それらを連結する必要があるということです。

ls -l data_ *

しかし私は得る

.....
data_89_box
data_8_box
data_90_box
...
data_99_box
data_9_box

1、2、3、4、...、9、...、89、90、91、...、99

バッシュでできますか?

30
Open the way
ls data_* | sort -n -t _ -k 2

-n:数値で並べ替え
-t:フィールド区切り文字 '_'
-k:2番目のフィールドでソートします。あなたの場合、最初の '_'の後の数字

61
Puppe

-vフラグをlsに?フラグの目的は、バージョン番号に従ってファイルを並べ替えることですが、ここでも同様に機能し、結果をsortにパイプする必要がなくなります。

ls -lv data_*
20
Pär Wieslander

sortにバージョンソートがある場合は、以下を試してください。

ls -1 | sort -V

(それは大文字Vです)。

9

これは一般的な答えです。特定のデータセットにルールを適用する必要があります

ls | sort

例:

ls | sort -n -t _ -k 2
2
Peter Lindqvist

多分あなたは好きになるでしょう SistemaNumeri.py ( "fix numbers"):それはあなたの名前を変更します

data_1_box
data_2_box
...
data_10_box
...
data_99_box

data_01_box
data_02_box
...
data_10_box
...
data_99_box
1
Vito De Tullio

ソートにバージョンソートがない場合にbashでそれを行う方法は次のとおりです。

cat <your_former_ls_output_file> | awk ' BEGIN { FS="_" } { printf( "%03d\n",$2) }' | sort | awk ' { printf( "data_%d_box\n", $1)  }'

すべて1行で。覚えておいてください、私はあなたの特定のデータでこれをテストしなかったので、あなたのために正しく働くためにそれは少し微調整を必要とするかもしれません。ただし、これは優れた堅牢で比較的単純なソリューションの概要です。もちろん、最初にcat + filenameを実際のlsといつでも入れ替えて、その場でファイルデータを作成できます。実際のファイル名の列をキャプチャするには、正しいlsパラメータを選択するか、cutまたはawkのいずれかを介してパイピングします。

1

私が考えることができる1つの提案はこれです:

for i in `seq 1 5`
do  
   cat "data_${i}_box"
done
0
Saravanan