从多个文件中打印第5列中最小值的行

时间:2019-07-29 12:50:33

标签: awk

如何从多个文件中打印第5列中最小值的行,并将文件名打印到每一行?

每个文件都有不同的行数-20、45、44 ...

file0
45 7 8 9 9
45 7 5 0 5
44 5 8 9 4
11 5 6 8 8

file1
78 77 8 5 9
78 9  9 7 1
77 8 5 5 5
10 2 3 3 3
88 9 6 5 2

file2
77 8 0 0 2 
3  3 6 9 8

所需结果:

file0
45 7 5 0 5
file1
78 9 9 7 1
file2
77 8 0 0 2

也许在$ 5中找到最小值作为某些变量,然后打印一行,其中包括$ 5中的该变量。

3 个答案:

答案 0 :(得分:1)

一种方法(需要GNU awk):

$ gawk 'BEGINFILE { minline = ""; minval = 1000000 }
        $5 < minval { minline=$0; minval=$5 }
        ENDFILE { print FILENAME; print minline }' file0 file1 file2
file0
44 5 8 9 4
file1
78 9  9 7 1
file2
77 8 0 0 2

minval设置为某个数字,如果100万个数字太低,该数字将大于任何文件第5列中的任何数字。

答案 1 :(得分:1)

一种略有不同的方法,我认为可以在任何awk中使用,而不仅仅是gawk

awk 'FNR==1{m[FILENAME]=$5;next};$5<m[FILENAME]{m[FILENAME]=$5}END{for (i in m) print i,m[i]}' file0 file1 file2

答案 2 :(得分:0)

请您尝试以下操作(仅通过提供的示例进行测试)。

awk 'FNR%2!=0{val=$0;field=$NF;next} {printf("%s\n",field>$NF?$0:val);val=""}'  file[0-2]

说明: 现在添加上述代码的说明。

awk '                                   ##Starting awk program here.
FNR%2!=0{                               ##Checking condition if line number is NOT divided by 2 then do following.
  val=$0                                ##Creating variable named val and setting its value to current line.
  field=$NF                             ##creating variable field whose value is last field of current line.
  next                                  ##next will skip all further statements from here.
}
{
  printf("%s\n",field>$NF?$0:val)       ##Printing $0 or val here depending upon condition, if field>$NF then print $0 or print val.
  val=""                                ##Nullifying variable val here.
}
'  file[0-2]                            ##Mentioning Input_file names file[0-2] means to take file0, file1 and file2 names.