複数のファイルの列で最小値を見つけて別のファイルに印刷する

複数のファイルの列で最小値を見つけて別のファイルに印刷する

次の file1 があります。

25       104.601  0.5 
24.8488  104      0.5 
24.5341  103      0.5 
24.1844  102      0.5 
24.1568  101      0.5 
24.1568  100      0.5 
24.1844  99       0.5 
24.5341  98       0.5 

列1の最小値を見つけて別のファイルに印刷する必要があります_NEW

これで、他のファイルに対して上記の操作を繰り返し、少なくとも100個のファイルの最小値を見つける必要があります。

これにより、file_NEWからこのような最終出力を取得できます。

24.1568
23.3254 (from file2)
22.312  (from file3)
.....

ここで、file2 と file3 には file1 に似たデータセットがあります。すべての入力ファイルは、file * .txtと同じ名前パターンを持ち、同じディレクトリにあります。

誰でもawkまたはsedを使用してこれを行う方法を提案できますか?

ありがとう

答え1

最小値を見つけるには、次のコマンドを使用できます。

各ファイルに対して次のコマンドを使用します。

awk 'NR==1{sum=$1}($1 < sum){sum=$1}END{print sum}'  filename >> outputfile

テストを経てうまく機能しました

答え2

awk '{print $1 "\t(from " FILENAME ")"}' file* | sort -k1,1n | awk -F'\t' '!seen[$2]++'

上記は、次の標準のUNIXツールを使用して、すべての入力ファイルを一度に強力かつ効率的に処理します。

$ cat file1
25       104.601  0.5
24.8488  104      0.5
24.5341  103      0.5
24.1844  102      0.5
24.1568  101      0.5
24.1568  100      0.5
24.1844  99       0.5
24.5341  98       0.5

$ cat file2
75       104.601  0.5
74.8488  104      0.5
74.5341  103      0.5
74.1844  102      0.5
74.1568  101      0.5
74.1568  100      0.5
74.1844  99       0.5
74.5341  98       0.5

$ awk '{print $1 "\t(from " FILENAME ")"}' file{1,2} | sort -k1,1n | awk -F'\t' '!seen[$2]++'
24.1568 (from file1)
74.1568 (from file2)

しかし、ファイル名にタブや改行文字が含まれていないとしましょう。タブが含まれている場合は、簡単な調整で処理できます。

awk '{print $1 "\t(from " FILENAME ")"}' file* |
sort -k1,1n |
awk '{f=$0; sub(/[^\t]*\t/,"",f)} !seen[f]++'

ただし、改行文字も含まれている場合は\0(NUL)、終了者を受け入れるためのGNUツールが必要です。

awk -v ORS='\0' '{print $1 "\t(from " FILENAME ")"}' file* |
sort -z -k1,1n |
awk -v RS='\0' '{f=$0; sub(/[^\t]*\t/,"",f)} !seen[f]++'

答え3

sed嫌い

find . -name "file*" -exec sh -c '
   echo $(sort -nk1 "$1"  | sed -n "1{s/ .*//p}" )" (from "${1##*/}")" ' sh {} \; | sort -nk1 > output.txt; cat output.txt

sortファイルを出力し、必要に応じてファイル名を追加します。

答え4

IIUCでは、すべてのファイルが次のようになります。

awk 'NF' FILE | sort -n -k1 - | awk 'NR==1{print $1}' >> file_NEW

awk 'NF' FILE入力ファイルに空白行がある場合は、最初の文字が必要です。このコマンドを特定のディレクトリ内のすべてのファイルに対して繰り返し実行するか、非再帰的に実行するか、名前に特定のパターンを持つ特定のファイルに対してのみ実行するかどうかを指定しませんでした。とにかく、find以下を使用して実行できます。

find . -name "FILE*" -exec sh -c 'awk "NF" FILE | sort -n -k1 - | awk "NR==1{print \$1}" >> file_NEW' sh {} \;

この場合、上記のコマンドは名前で始まる指定されたディレクトリを照会しますFILE

また、すべてがfile_NEW見つかったすべてのファイルで盲目的に実行されるため、出力にソートされたリストが必ずしも提供されるわけではありません。find-exec

関連情報