2017-03-10 39 views
1

my previous questionにリンクすると、この問題は完全には解決されないことがわかりました。Bash:列の最大値からファイルに再帰的に行を書き込む

RUN1RUN2RUN3 という名前のディレクトリがあります。各ディレクトリにはいくつかのファイルがあります。ディレクトリRUN1には、mod1_1.csv,mod1_2.csv,mod1_3.csvというファイルがあります。 RUN2、mod2_1で

5.73 6.43 5.76 6.57 
5.79 6.20 5.10 7.01 
5.71 6.21 5.34 6.81 

5.71 6.66 5.52 6.90 
5.78 6.69 5.55 6.98 
5.77 6.63 5.73 6.91 

そしてmod1_2.csvは次のようになります。ディレクトリRUN2mod1_1.csvファイルのファイルmod2_1.csvmod2_2.csvmod3_3.csvなど

内容は次のようになります。 CSVは次のようになります。

5.72 6.29 5.39 5.59 
5.71 6.10 5.10 7.34 
5.70 6.23 5.23 6.45 

そしてmod2_2.csv次のようになります。

5.72 6.29 5.39 5.69 
5.71 6.10 5.10 7.32 
5.70 6.23 5.23 6.21 

私の目標は、各RUNの*ディレクトリの列4の最小値を持つ行を取得し、それを書くことで、新たなにそれを与えたモデル.csvファイル。今、私はこのコードを持っている:

#!/bin/bash 
resultfile="best_results_mlp_2.txt" 
for d in $(find . -type d -name 'RUN*' | sort); 
do 
    find $d -type f -name 'mod*' -exec sort -k4 {} -g \; | head -1 >> "$resultfile" 
done 

しかし、それは常に列4の最小値を返しません(私は、ファイルを経て、確認を)、それが含まれているファイル名が含まれていません。最小番号。明確にするために、私はこれらの内容を.csvファイルたい:

5.73 6.43 5.76 6.57 mod1_2.csv 
5.72 6.29 5.39 5.59 mod2_1.csv 

答えて

0

を使用すると、すべてのファイルの最小値を取得したい場合は、一度にすべてのコンテンツをソートする必要があります。コマンドは現在、ファイルごとにソートするため、最初にソートされたファイルの中で最小値を取得します。

はまた、あなたが本当にする必要がない限り、-nの代わり-gを使用することをお勧めします

find "$d" -type f -name 'mod*' -exec sort -k4 -g {} + 

find "$d" -type f -name 'mod*' -exec sort -k4 -g {} \; 

の違いを確認してください。詳細については、 info coreutils 'sort invocation'--general-numeric-sortセクションを確認してください。

編集:ちょうどあなたの前の質問へのリンクをチェックし、私はあなたが言った--general-numeric-sort

を使用する必要があることを今見、あなたがそれを持っているように、ここでは、行に対応するファイル名を取得する方法です出力内:

find "$d" -type f -name 'mod*' -exec awk '{print $0, FILENAME}' {} \;|sort -k4 -g |head -1 >> "$resultfile" 

awkは、ファイルごとに個別に呼び出されます。 Awkはファイルの各行を出力し、対応するファイル名を追加します。そして、すべての行がソートのために渡されます。

注:上記では、ファイル名のパスにfindが見つかりました。あなただけのファイルのベース名を取得するために探している場合は、(残りは上記と同じまま)の代わりに、次のawkコマンドを使用することができます

awk 'FNR==1{ cnt=split(FILENAME, arr, "/"); basename=arr[cnt] } { print $0, basename}' 
+0

代わりからわずかパスの全体のパスを取得する方法はありますこのディレクトリに?たとえば、私のbashファイルが/ dir1/dir2に保存されていて、新しい.csvファイルの最後の列として/dir1/dir2/RUN1/mod1_1.csvというパスが必要な場合です。 – StatsSorceress

+0

または、新しい.csvファイルの最後の列として/dir2/RUN1/mod1_1.csvのような、現在のパスのサブセット。 – StatsSorceress

+0

'find'はファイルが見つかったパスを渡します。したがって、 ''/path/to/$ d "'で検索すると、 '' /path/to/$d/filename.csv "'となります。取得したいパスで 'find'検索を行います。 – dgeorgiev

関連する問題