如何使用 sed、sort、tail 查找文件的每 n 个间隔中列的最小值?

如何使用 sed、sort、tail 查找文件的每 n 个间隔中列的最小值?

我想在文件的每 12 个间隔中找到文件第 5 列的最小值,并将相关行保存到一个新文件中。

要找到我可以使用的最后 12 行的最小值

tail -n 12  $FILEname | sort -g -k 5,5 | head -1|  awk '{print}'> tmp.out

但我怎样才能迭代地执行这样的过程呢?我努力了

while read $FILEname
do
 ....
done

但这并不成功。

该文件看起来像

4.7 0.17    0.529   0   4.4846
4.7 0.17    0.529   1   4.5437474
4.7 0.17    0.529   2   5.63229739
4.7 0.17    0.529   3   4.672385157
4.7 0.17    0.529   4   4.698922468
4.7 0.17    0.529   5   4.699977195
4.7 0.17    0.529   6   4.699969329
4.7 0.17    0.529   7   3.69999717
4.7 0.17    0.529   8   4.6999998
4.7 0.17    0.529   9   2.7
4.7 0.17    0.59    10  3.9999998
4.7 0.17    0.59    11  4.69999999998
5   1   0.59    0   4.49569846
5   1   0.59    1   4.54330574
5   1   0.59    2   4.63739653
5   1   0.59    3   3.67233957
5   1   0.59    4   4.6989202468
5   1   0.59    5   4.699912595
5   1   0.59    6   4.6999329
5   1   0.59    7   4.69999999717
5   1   0.59    8   4.69999998
5   1   0.59    9   3.2547
5   1   0.529   10  4.69999999998
5   1   0.529   11  4.69999999998

有近2000行。

答案1

尝试

awk 'NR%12 == 1 { min=$5 ; line=$0; } 
    { if ($5 < min) { min=$5 ;line=$0; } } 
    NR%12 == 0 { print line ;} 
    END { if (NR%12) print line ;} ' 

这基本上每 12 行(1,13,25,...)重置 min,计算 min,并打印第 12,24,36,...行

如果行数不是 12 的倍数,则 END 语句打印最后分钟。

请注意,您可以将此语句写成一行,并使用以下命令调用它

awk '....' input_file.txt

相关内容