次のファイルがたくさんあります。
ファイル1:
408.60 0.0847
370.03 0.1571
307.49 0.1492
297.12 0.0708
274.36 0.1989
251.27 0.1640
ファイル2:
391.06 0.0589
368.55 0.2293
313.87 0.0369
299.94 0.1432
288.61 0.2125
252.57 0.1238
ファイル3:
395.74 0.2439
372.76 0.0658
323.80 0.0026
287.41 0.3337
268.44 0.0860
259.44 0.0680
選択基準に基づいて各入力ファイルの特定の行を選択したいと思います。選択基準は次のとおりです。
a)最初の列は290.00より大きい数字でなければなりません。
b)2番目の列は最大数でなければなりません。
c)この行を印刷してください
出力は次のようになります。
370.03 0.1571
368.55 0.2293
395.74 0.2439
答え1
直接解決
for file in file{1..3}; do
sort -rk2 "$file" | awk '$1 > 290{print;exit}'
done
またはawkを使用しないでください
for file in file{1..3}; do
while read field1 field2 ; do
[ "field1" -gt 290 ] && { echo $field1 $field2; break; }
done <(sort -rk2 "$file")
done
それとも一人ぼっち
awk '
FNR == 1 || $1 > 290 && max < $2 {
max = $2
if (FNR == 1 && max) {
print line
if ($1 <= 290)
max = -1 }
line= $0 }
END {
print line }
' file{1..3}
答え2
for f in file1 file2 file ; do cat $f | awk '{printf("%s %s\n",$2,$1)}' | sort -n | tail -n 1 | awk '{printf("%s %s\n",$1,$2)}' ; done
答え3
GNU awkがある場合、これを行う方法は次のとおりです。 2番目のフィールドを配列インデックスとして使用し、asorti
各ファイルの末尾にあるそのインデックスに基づいてソートするように機能します。
gawk '
BEGINFILE{delete a}
$1+0 > 290 {a[$2]=$0; next;}
ENDFILE{n = asorti(a,b); print a[b[n]]}
' file{1..3}
370.03 0.1571
368.55 0.2293
395.74 0.2439