ヘッダー情報を使用したイメージファイルのソート

ヘッダー情報を使用したイメージファイルのソート

私のディレクトリに同じ拡張子(.mrc)を持つ複数の画像ファイルがあります。端末で header を実行すると、次のような出力が提供されます。

 RO image file on unit   1 : FoilHole_17224697_Data_18256098_18256099_20150819_2015.mrc     Size=      65537 K

         This file has invalid axis indices, adjusting them to 1,2,3

 Number of columns, rows, sections .....    4096    4096       1
 Map mode ..............................    2   (32-bit real)              
 Start cols, rows, sects, grid x,y,z ...    0     0     0    4096   4096      1
 Pixel spacing (Angstroms)..............   1.000      1.000      1.000    
 Cell angles ...........................    0.000    0.000    0.000
 Fast, medium, slow axes ...............    X    X    X
 Origin on x,y,z .......................    0.000       0.000       0.000    
 Minimum density .......................   2056.0                               
 Maximum density .......................   4462.0                               
 Mean density ..........................   3213.5                               
 tilt angles (original,current) ........   0.0   0.0   0.0   0.0   0.0   0.0
 Space group,# extra bytes,idtype,lens .        0        0        0        0

     1 Titles :
EMAN 9/18/2015 15:41 

「平均密度」値の範囲を指定し、その範囲内の「平均密度」値を含む選択したファイルを新しいディレクトリにコピーできるスクリプトを探しています。

注:ヘッダーはIMODイメージ処理パッケージに含まれるプログラムです。 「ヘッダー」機能の詳細については、次のサイトをご覧ください。http://bio3d.colorado.edu/imod/doc/program_listing.html#TOP

答え1

.mrcファイルに関する情報を一覧表示する特別なツールがない場合は、圧縮/圧縮解除機能があり、Perlなどの浮動小数点値を処理できるいくつかのスクリプト言語を使用することをお勧めします。印刷したばかりの出力がコマンドの出力である場合は、forループをgrepできます。

$!/bin/sh

treshold=42.0
for file in *.mrc
do
mean_density=$(header $file | grep "Mean density" | awk '{print $2}')
if [ $(echo "$mean_density>$treshold" | bc) -eq 1 ]
then
    echo "$i match!"
fi
done

編集する、

"header"コマンドは、質問に引用した形式で.mrcファイルのヘッダーを印刷すると仮定します。そのようなプログラムがなければ、Perl unpack機能は間違いなく必要です。

答え2

探している範囲が3,000 - 3,999の場合は、次のコマンドを実行してください。

grep -L -E "^Mean density \.+ 3\d\d\d(\.\d+)?$" *.mrc

探している平均密度でファイルのリストを印刷する必要があります。より複雑な正規表現が可能です。または、人間が読める形式を取得するために実行する必要がある場合は、header出力をパイプで接続しegrepて戻り値をテストできますfor f in *.mrc

関連情報