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
。