如何使用awk搜索某些文件中列的最小值和最大值

时间:2017-04-01 21:25:02

标签: bash unix scripting

我知道awk有助于在文件的列中查找某些内容,但我不确定如何使用它来查找一组文件中列的最小值和最大值。有什么建议?具体来说,我在目录中有四个文件,我想通过awk。

3 个答案:

答案 0 :(得分:1)

如果您要查找所有文件中列N的绝对最大值和最小值,则可以使用:

N=6
awk -v N=$N 'NR == 1 { min = max = $N }
                     { if ($N > max) max = $N; else if ($N < min) min = $N }
             END     { print min, max }' "$@"

您可以使用命令行选项或编辑脚本来更改列号(粗略但有效 - 使用选项处理),或任何其他您喜欢的方法。

如果您想要每个文件的列N的最大值和最小值,那么您必须检测新文件,并且您可能也想要识别这些文件:

 awk -v N=$N 'FNR == 1 { if (NR != 1) print file, min, max; min = max = $N; file = FILENAME }
                       { if ($N > max) max = $N; else if ($N < min) min = $N }
              END      { print file, min, max }' "$@"

答案 1 :(得分:0)

试试这个:它会以逗号分隔给文件中的min和max。

简单:

awk 'BEGIN {max = 0} {if ($6>max) max=$6} END {print max}' yourfile.txt

awk 'BEGIN {min=1000000; max=0;}; { if($2<min && $2 != "") min = $2; if($2>max && $2 != "") max = $2; } END {print min, max}' file

或更糟糕的方式:

awk 'NR==1 { max=$1 ; min=$1 }
     FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
     { $2=($1-min)/(max-min) ; print }' file file

答案 2 :(得分:0)

sort可以进行排序,您可以通过任何方式获取第一个和最后一个,例如awk

sort -nk2 file{1..4} | awk 'NR==1{print "min:"$2} END{print "max:"$2}'

通过文件file1,file2,file3,file4的第二个字段按数字排序,并打印最小值和最大值。

由于你没有提供任何输入文件,这里有一个工作的例子,文件

==> file_0 <==
23 29 84
15 58 19
81 17 48
15 36 49
91 26 89

==> file_1 <==
22 63 57
33 10 50
56 85 4
10 63 1
72 10 48

==> file_2 <==
25 67 89
75 72 90
92 37 89
77 32 19
99 16 70

==> file_3 <==
50 93 71
10 20 55
70 7 51
19 27 63
44 3 46

如果您运行脚本,现在使用可变列号n

n=1; sort -k${n}n file_{0..3} | 
awk -v n=$n 'NR==1{print "min ("n"):",$n} END{print "max ("n"):",$n}'

你会得到

min (1): 10
max (1): 99

以及n

的其他值
n=2; sort ...

min (2): 3
max (2): 93

n=3; sort ...

min (3): 1
max (3): 90