Perl 查找“;";最低及;";文件中某列的最大值,并打印特定行

Perl 查找“;";最低及;";文件中某列的最大值,并打印特定行,perl,bash,unix,scripting,awk,Perl,Bash,Unix,Scripting,Awk,我有一个以制表符分隔的文件,例如 Jack 2 98 F Jones 6 25 51.77 Mike 8 11 61.70 Gareth 1 85 F Simon 4 76 4.79 Mark 11 12 38.83 Tony 7 82 F Lewis 19 17 12.83 James 12 1 88.83 我想在最后一次打印具有这些值的行时找到N个最小值和N个最大值(大于5)。我想忽略带有E的行。例

我有一个以制表符分隔的文件,例如

Jack    2   98  F
Jones   6   25  51.77
Mike    8   11  61.70
Gareth  1   85  F
Simon   4   76  4.79
Mark    11  12  38.83
Tony    7   82  F
Lewis   19  17  12.83
James   12  1   88.83
我想在最后一次打印具有这些值的行时找到N个最小值和N个最大值(大于5)。我想忽略带有E的行。例如,如果我想要上述数据中的最小值和最大值,我的输出将是

最小情况

Simon   4   76  4.79
Lewis   19  17  12.83
最大情况

James   12  1   88.83
Mike    8   11  61.70
我可以使用忽略第四列中没有数值的列

awk -F "\t" '$4+0 != $4{next}1' inputfile.txt
我还可以通过管道传输这个输出,并使用

awk -F "\t" '$4+0 != $4{next}1' inputfile.txt |awk 'NR == 1 || $4 < min {line = $0; min = $4}END{print line}'
awk-F“\t”$4+0!=$4{next}1'inputfile.txt | awk'NR==1 | |$4

与最大值类似,但如何将其扩展到多个值,如上面玩具示例中的2个值和实际数据的10个值。

n
可能是一个变量。在本例中,我设置了
n=3
。不是,如果最后一列中有具有相同值的行,则可能会出现问题

kent$  awk -v n=3 '$NF+0==$NF{a[$NF]=$0}
        END{ asorti(a,k,"@ind_num_asc")
                print "min:"
                for(i=1;i<=n;i++) print a[k[i]]
                print "max:"
                for(i=length(a)-n+1;i<=length(a);i++)print a[k[i]]}' f
min:
Simon   4   76  4.79
Lewis   19  17  12.83
Mark    11  12  38.83
max:
Jones   6   25  51.77
Mike    8   11  61.70
James   12  1   88.83
kent$awk-vn=3'$NF+0==NF{a[$NF]=0}
完{asorti(a,k,“@ind_num_asc”)
打印“最小值:”

对于(i=1;i,这里有一个解决问题的管道方法

$ grep -v 'F$' inputfile.txt | sort -nk 4  | head -2
Simon   4   76  4.79
Lewis   19  17  12.83

$ grep -v 'F$' inputfile.txt | sort -rnk 4 | tail -2
Mike    8   11  61.70
James   12  1   88.83

只需稍加重定向,即可同时获得最小值和最大值:

minmaxlines=2
( ( grep -v 'F$' inputfile.txt | sort -n -k4 | tee /dev/fd/4 | head -n $minmaxlines >&3 ) 4>&1 | tail -n $minmaxlines ) 3>&1

对于最大情况,请先输入最高的.awk'$NF!=“F”'文件| sort-k4nr | head-2您应该提到
asorti
needs
gnu awk
您能稍微解释一下代码吗?如果有负值,它会在第一个负值后打印空行