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

Awk 打印多个文件第5列中最小值的行,awk,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

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

请尝试以下内容(仅使用您提供的样本进行测试)

解释:现在为上述代码添加解释

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.
单向(需要GNU awk):

$gawk'BEGINFILE{minline=”“;minval=1000000}
$5

如果一百万太少,将
minval
设置为比任何文件第5列中的任何数字都大的数字。

一种稍微不同的方法,我认为它可以在任何
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

awk'FNR==1{m[FILENAME]=$5;next}$非常感谢。你能给我解释一下吗?当我测试我在这里写的数据时,没有文件名,当我测试我的原始数据时,行比文件多。我没有否决投票,但它不会从发布的示例输入中产生发布的预期输出(它不会打印文件名)而且它只适用于每行正好有2行的文件,这是一个很大的假设,可能是错误的(是的,我知道OP提供了一个例子,但我强烈怀疑它是一个坏的)。为什么有奇数行的条件?@LukášAltman,因为您发布的示例输入每个文件正好有2行,所以这就是此解决方案的设计目的。如果这不能代表您的真实数据(例如,您的文件可以有1行或3行),请修复您的示例。。。我们鼓励所有的人在他们的帖子中加入他们的努力,所以请一直这样做。非常感谢你,为什么不可能用写来代替file1 file2 file3。。。文件[1-11]@LukášAltman如果你愿意,你可以。虽然
文件[1-11]
扩展为仅
文件1
,这可能不是您想要的。是否可以替换文件1文件2文件3。。。file11请?@LukášAltman只需使用您想要的任何通配符模式即可扩展到您需要的文件。如果你不知道那意味着什么。。。[shell]标签下可能有很多现有问题可以帮助解释。即使是基本的sh/bash/etc.教程也应该有希望涵盖这个主题,或者阅读shell的文档。这与查找最小行的问题无关。非常感谢
$ 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
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