次の 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