【发布时间】:2016-09-28 04:08:11
【问题描述】:
我是这个网站的新手,正在尝试学习 awk。我试图找到field3的最大值,按field1分组并打印所有具有最大值的字段。字段 2 包含时间,这意味着对于每个 item1,字段 2、字段 3 和字段 4 有 96 个值
输入文件:(逗号分隔)
item1,00:15,10,30
item2,00:45,20,45
item2,12:15,30,45
item1,00:30,20,56
item3,23:00,40,44
item1,12:45,50,55
item3,11:15,30,45
想要的输出:
item1,12:45,50,55
item2,12:15,30,45
item3,11:15,30,45
到目前为止我尝试了什么:
BEGIN{
FS=OFS=","}
{
if (a[$1]<$3){
a[$1]=$3}
}
END{
for (i in a ){
print i,a[i]
}
但这只会打印
item1,50
item2,30
item3,30
但我需要打印相应的 field2 和 field4 以及所需的输出中显示的最大值。请帮忙。
【问题讨论】:
-
注意输出应该是
item3,23:00,40,44,因为40是item3最大的第三列。 -
如果可能发生,则在您的输入/输出中包含具有相同 $1 和 $3 但不同 $2 值的行,以便我们可以查看您是否希望输出第一条或最后一条或所有匹配的行。如果不能发生,请说明。
-
@Ed Morton 相同的 1 美元,2 美元不同,3 美元可以相同。关于您提出的解决方案,我只是不明白不使用 !($1 in max) 块的后果。我想到的另一件事是,如果按两列分组,说 $1 和 $2 那么这个 !($1 in max) 块和排序是如何工作的?
-
@fox 1)
for same $1, $2 is different, $3 can be same然后按照我的建议将该案例包含在您的示例输入/输出中,以便我们可以看到您希望如何处理它(有几个选项)。 2)consequence of not using the !($1 in max) block- 如果你有输入行item4,11:15,0,45没有它,你会得到一个空行输出而不是那个输入行(想想 max[$1] 在你填充它之前有什么值)。 3) 你会使用max[$1,$2]和!(($1,$2) in max)。 -
我最近遇到了这个空行问题,但不知道为什么。感谢您的精彩解释。现在我知道了原因,学到了一件好事。