1つの列が最大値などのテキストファイルから行を抽出します。

1つの列が最大値などのテキストファイルから行を抽出します。

file.txtというテキストファイル(ヘッダー行を含む)があります。特定の列の最大値と同じ行を抽出しようとしています(最大値が何であるかわかりません)。

ID t1 q1 t2 q2 q3 
1 f 45 ex 1 45
2 r 47 tr 1 33
3 r 33 ex 2 44
4 f 44 s 0 55
5 e 32 ex 0 54
6 f 34 tr 2 46

$5 列の最大値を見つけて、列 5 はその数と同じ行のみを印刷する必要があります。

3 r 33 ex 2 44
6 f 34 tr 2 46

次のコードはうまくいくと思いますが、ファイルが大きくて時間がかかるので、より速い解決策を探しています(ソートを使用している可能性があります)。

これが私が今持っているものです:

まず最大値を見つけます。

max=`awk '{print $5}' file.txt | sort -nr | sed -n 2p`

次に、列5はこの値と同じ行を選択します。

awk 'NR>1' file.txt|while read LINE; do value=`echo $LINE|awk '{print $5}'`; if [ $value -eq $max ]; then echo $LINE >> test.txt; fi; done

ベストアンサー1

1つの方法は、ファイルを一度読み込み、max関連する行を再印刷することです。

max=$(awk 'NR>1 && $5>max {max=$5}; END{print max}' file.txt) && 
 awk -v max="$max" '$5==max' file.txt 

またはもっと簡潔に言えば:

awk -v m="$(awk '(NR>1 && $5>m){m=$5};END{print m}' file.txt)"  '$5==m' file.txt 

ここでの秘密は、-v変数をに渡すことができるawkフラグですawk。この場合、まず最大値を計算し、awkそれを変数として指定しましたmax

おすすめ記事