複数のファイル名部分を持つファイルをソートする方法は?

複数のファイル名部分を持つファイルをソートする方法は?

私のファイル名は、多くのファイルに対して繰り返される形式ですSTR_NUM1_STR_NUM2_NUM3_NUM4_STR.dat。まず、各NUM1グループと各NUM1グループ内NUM1でファイルをソートしたいと思います。 Bashでどうすればいいですか?NUM1NUM4

Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat

答え1

要約すると、_フィールド区切り文字で2番目と6番目のフィールドの数字を並べ替えようとしています。この場合、ファイル名が名前付きファイルにある場合filenames(1行に1つのファイル)、次のように使用します。

$ sort -nt_ -k2,2 -k6,6 filenames
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

ファイルが現在ディレクトリにある場合、POSIXソリューションは次のようになります。

$ find . -maxdepth 1 -type f -name '*.dat' | sort -nt_ -k2,2 -k6,6
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

どのように動作しますか?

  • -nsort数字順に並べ替えてください。

  • -t_フィールド区切り文字sortとして使用するように指示します。_

  • -k2,2 -k6,6 2番目のフィールドがソートされたことを示しsort、2番目のフィールドが同じ場合、6番目のフィールドがソートされます。

GNUソリューション(改行文字を含むファイル名の処理)

改行を含むファイル名を処理するには、NUL区切りを使用する必要があります。これは、 -print0withfind-zwithを使用sortして出力を印刷可能にし、ここに表示するには、次を使用してNULを改行に変換することを意味しますtr

$ find . -maxdepth 1 -type f -name '*.dat' -print0 | sort -znt_ -k2,2 -k6,6 | tr '\0' '\n'
./Tmp1_24298_Data_545_547_63359_Sample.dat
./Tmp1_24298_Data_701_703_63437_Sample.dat
./Tmp1_24298_Data_683_685_63517_Sample.dat
./Tmp1_24298_Data_695_697_63557_Sample.dat
./Tmp1_24298_Data_667_669_63637_Sample.dat
./Tmp1_28703_Data_545_547_63833_Sample.dat
./Tmp2_28703_Data_701_703_63910_Sample.dat
./Tmp2_28703_Data_683_685_63951_Sample.dat
./Tmp2_28703_Data_695_697_64031_Sample.dat
./Tmp1_28703_Data_667_669_64111_Sample.dat
./Tmp2_28707_Data_545_547_64306_Sample.dat
./Tmp2_28707_Data_701_703_64344_Sample.dat
./Tmp2_28707_Data_683_685_64424_Sample.dat
./Tmp2_28707_Data_295_697_64505_Sample.dat
./Tmp2_28707_Data_667_669_64545_Sample.dat

関連情報