Bash:複数のファイルの行を1つの出力ファイルに追加し、ファイル名を列として追加します。

Bash:複数のファイルの行を1つの出力ファイルに追加し、ファイル名を列として追加します。

これは前の質問につながります。 Bash:複数のファイルから指定された列の最も高い値を持つ行を選択し、最も高い値を持つ行を含む出力ファイルを作成します。

私が使った解決策は次のとおりです。

for file in mi*
do
    sort -k14,14 -n $file | tail -1
done > result

出力ファイルを作成するときにファイル名を含む列を追加できるように、このコードを編集する簡単な方法があるのか​​、それとも別のアプローチを使用する必要があるのか​​疑問に思います。

この問題を発見しました複数のファイルからデータを取得し、ファイル名を追加するBashコマンドしかし、私のニーズに合わせて調整する方法がわかりません。

追加情報で更新:ファイルはtsvで、列名があります。

答え1

for file in mi*
do
    printf "%s " $file
    sort -k14,14 -n $file | tail -1
done > result

または

for file in mi*
do
    echo "$file $(sort -k14,14 -n $file | tail -1)"
done > result

区切り文字に応じて、ファイル名の後のスペースを別の文字に置き換えることができます。

答え2

トリックは、stdoutに送信された内容を変数に入れてから、その変数とファイル名を出力することです。

エコーで変数の順序を変更したり、重要な場合は区切り文字を追加することもできます。

例えば。

for file in mi*
do
    myline=$(sort -k14,14 -n $file | tail -1)
    echo "$file $myline"
done > result

見つかった答えはsearchというコマンドを使用しますgrep。複数のファイルを検索する場合は、検索文字列が見つかったファイル名の前にオプションでgrepを追加できます。

関連情報