Awk 如何打印最后一列的最大值对应的行?

Awk 如何打印最后一列的最大值对应的行?,awk,Awk,我正在尝试根据第二个最后一列的最大值打印整行- 输入文件:file1.txt 2019-01-16 08:00:00.0 test1 28848859233 2019-01-16 08:00:00.0 test2 902006478 2019-01-16 08:00:00.0 test3 5385892905 2019-01-16 08:00:00.0 test1 4194204503 2019-01-15 08:00:00.0 test1 1155985

我正在尝试根据第二个最后一列的最大值打印整行-

输入文件:file1.txt

2019-01-16 08:00:00.0   test1   28848859233
2019-01-16 08:00:00.0   test2   902006478
2019-01-16 08:00:00.0   test3   5385892905
2019-01-16 08:00:00.0   test1   4194204503
2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-15 08:00:00.0   test4   39377518945
2019-01-15 08:00:00.0   test5   35371907528
2019-01-14 08:00:00.0   test1   115598553811
2019-01-14 08:00:00.0   test3   5408381147
2019-01-14 08:00:00.0   test4   346377518945
预期产出-

2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528
当我试图使用它来驱动列(3)和所需列(4)的最大值时,它起了作用

awk '{if (a[$3] < $4) {a[$3]=$4}} END {PROCINFO["sorted_in"] = "@ind_num_asc" ; for (i in a) {print i, a[i]}}' file1.txt
test1 115598553821
test2 59736397346
test3 5508381147
test4 346377518945
test5 35371907528
awk'{if(a[$3]<$4){a[$3]=$4}}END{PROCINFO[“sorted_in”]=“@ind_num_asc”;用于(a中的i){print i,a[i]}'file1.txt
测试115598553821
测试2 59736397346
测试3 5508381147
测试4 346377518945
测试5 35371907528
我尝试在下面的命令中打印整行,但没有成功-

awk '{if (a[$3] < $4) {a[$3]=$4;b[$0]=a[$3]}} END {PROCINFO["sorted_in"] = "@ind_num_asc" ;for (i in b) {print i, b[i]}}' file1.txt
2019-01-15 08:00:00.0   test4   39377518945 39377518945
2019-01-15 08:00:00.0   test2   59736397346 59736397346
2019-01-15 08:00:00.0   test3   5508381147 5508381147
2019-01-16 08:00:00.0   test2   902006478 902006478
2019-01-14 08:00:00.0   test4   346377518945 346377518945
2019-01-15 08:00:00.0   test5   35371907528 35371907528
2019-01-15 08:00:00.0   test1   115598553821 115598553821
2019-01-16 08:00:00.0   test3   5385892905 5385892905
2019-01-16 08:00:00.0   test1   28848859233 28848859233
awk'{if(a[$3]<$4){a[$3]=4;b[$0]=a[$3]}}END{PROCINFO[“sorted_in”]=“@ind_num_asc”;对于(b中的i){print i,b[i]}file1.txt
2019-01-15 08:00:00.0测试4 39377518945 39377518945
2019-01-15 08:00:00.0测试2 59736397346 59736397346
2019-01-15 08:00:00.0测试3 5508381147 5508381147
2019-01-16 08:00:00.0测试2 902006478 902006478
2019-01-14 08:00:00.0测试346377518945 346377518945
2019-01-15 08:00:00.0测试35371907528 35371907528
2019-01-15 08:00:00.0测试11559855382115598553821
2019-01-16 08:00:00.0测试3 5385892905 5385892905
2019-01-16 08:00:00.0测试1 28848859233 28848859233
第一种解决方案:请尝试以下方法

awk '
{
  a[$3]=$NF>a[$3]?$NF:a[$3]
  b[$3,$NF]=$1 OFS $2
}
END{
  for(i in a){
    print b[i,a[i]],i,a[i]
  }
}'   Input_file
第二种解决方案:以下将处理$3的输出顺序(第三个字段)将与输入文件的第三个字段顺序相同

awk '
!c[$3]++{
  d[++count]=$3
}
{
  a[$3]=$NF>a[$3]?$NF:a[$3]
  b[$3,$NF]=$1 OFS $2
}
END{
  for(i=1;i<=count;i++){
   print b[d[i],a[d[i]]],d[i],a[d[i]]
  }
}'  Input_file
awk'
!c[$3]++{
d[++计数]=$3
}
{
a[$3]=$NF>a[$3]?$NF:a[$3]
b[$3,$NF]=1美元/2美元
}
结束{
对于(i=1;ia[$3]?$NF:a[$3]##如果$NF>a[$3]的值,则创建一个名为a的数组,其值为当前行的$NF,否则它不会更改。
b[$3,$NF]=$1 of s$2##创建一个索引为$3的数组b,$NF,值为$1 of s$2。
}##这里是封闭街区。
结束{##这里是awk程序的起始结束块。
对于(i=1;i第一种解决方案:请尝试以下内容

awk '
{
  a[$3]=$NF>a[$3]?$NF:a[$3]
  b[$3,$NF]=$1 OFS $2
}
END{
  for(i in a){
    print b[i,a[i]],i,a[i]
  }
}'   Input_file
第二种解决方案:以下将处理$3的输出顺序(第三个字段)将与输入文件的第三个字段顺序相同

awk '
!c[$3]++{
  d[++count]=$3
}
{
  a[$3]=$NF>a[$3]?$NF:a[$3]
  b[$3,$NF]=$1 OFS $2
}
END{
  for(i=1;i<=count;i++){
   print b[d[i],a[d[i]]],d[i],a[d[i]]
  }
}'  Input_file
awk'
!c[$3]++{
d[++计数]=$3
}
{
a[$3]=$NF>a[$3]?$NF:a[$3]
b[$3,$NF]=1美元/2美元
}
结束{
对于(i=1;ia[$3]?$NF:a[$3]##如果$NF>a[$3]的值,则创建一个名为a的数组,其值为当前行的$NF,否则它不会更改。
b[$3,$NF]=$1 of s$2##创建一个索引为$3的数组b,$NF,值为$1 of s$2。
}##这里是封闭街区。
结束{##这里是awk程序的起始结束块。
对于(i=1;i请尝试以下方法:

$ awk '!n[$3] || n[$3]<$4{n[$3]=$4;l[$3]=$0;}END{for(i in l) print l[i]}' file1.txt
2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528
$awk'!n[$3]| | n[$3]试试这个,请:

$ awk '!n[$3] || n[$3]<$4{n[$3]=$4;l[$3]=$0;}END{for(i in l) print l[i]}' file1.txt
2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528

$awk'!n[$3]| | n[$3]我找出了问题所在,我应该在满足所需条件时将
$0
存储在数组b的驱动列(3)上(从
$NF
中查找最大值保存到驱动列(3)a[$3]=4),而不是将列(3)的数组a和整行一起存储到数组b中。类似这样的内容-

awk '{if (a[$3] < $4) {a[$3]=$4;b[$3]=$0}} END {PROCINFO["sorted_in"] = "@ind_num_asc" ;for (i in b) {print b[i]}}' file1.txt
2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528
awk'{if(a[$3]<$4){a[$3]=$4;b[$3]=$0}}}END{PROCINFO[“sorted_in”]=“@ind_num_asc”;for(i in b){print b[i]}}file1.txt
2019-01-15 08:00:00.0测试115598553821
2019-01-15 08:00:00.0测试2 59736397346
2019-01-15 08:00:00.0测试3 5508381147
2019-01-14 08:00:00.0测试346377518945
2019-01-15 08:00:00.0测试5 35371907528

我发现了问题所在,当所需条件满足时,我应该将
$0
存储在数组b的驱动列(3)上(从
$NF
中查找最大值保存到驱动列(3)a[$3]=$4),而不是将列(3)的数组a整行存储到数组b中。类似这样的情况-

awk '{if (a[$3] < $4) {a[$3]=$4;b[$3]=$0}} END {PROCINFO["sorted_in"] = "@ind_num_asc" ;for (i in b) {print b[i]}}' file1.txt
2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528
awk'{if(a[$3]<$4){a[$3]=$4;b[$3]=$0}}}END{PROCINFO[“sorted_in”]=“@ind_num_asc”;for(i in b){print b[i]}}file1.txt
2019-01-15 08:00:00.0测试115598553821
2019-01-15 08:00:00.0测试2 59736397346
2019-01-15 08:00:00.0测试3 5508381147
2019-01-14 08:00:00.0测试346377518945
2019-01-15 08:00:00.0测试5 35371907528

使用始终方便的非awk解决方案:

$datamash-Wsf groupby 3最多4
使用始终方便的非awk解决方案:

$datamash-Wsf groupby 3最多4
排序/awk
合作

$ sort -k3,3 -k4nr file | awk '!a[$3]++'

2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528

排序/awk
合作

$ sort -k3,3 -k4nr file | awk '!a[$3]++'

2019-01-15 08:00:00.0   test1   115598553821
2019-01-15 08:00:00.0   test2   59736397346
2019-01-15 08:00:00.0   test3   5508381147
2019-01-14 08:00:00.0   test4   346377518945
2019-01-15 08:00:00.0   test5   35371907528

您的实际预期输出是什么?您是否想要日期列?预期输出应该具有如上所述的日期列。@VIPIN KUMAR,找个时间给出它,当您看到问题的答案很少时,尝试从中选择正确的答案,快乐学习。您的实际预期输出是什么?您想要日期列吗是否?预期输出应该有我上面提到的日期栏。@VIPIN KUMAR,找个时间给它,当你看到问题的答案很少时,试着从中选择正确的答案,快乐学习。