如何从多个文件中打印第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中的该变量。
答案 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.