从一列中打印具有最高值的整行

Posted

技术标签:

【中文标题】从一列中打印具有最高值的整行【英文标题】:Print whole line with highest value from one column 【发布时间】:2018-07-09 21:05:20 【问题描述】:

我现在有一个小问题。 我有一个包含 4 列的文件

test0000002,10030010330,c_,218
test0000002,10030010330,d_,202
test0000002,10030010330,b_,193
test0000002,10030010020,c_,178
test0000002,10030010020,b_,170
test0000002,10030010330,a_,166
test0000002,10030010020,a_,151
test0000002,10030010020,d_,150
test0000002,10030070050,c_,119
test0000002,10030070050,b_,99
test0000002,10030070050,d_,79
test0000002,10030070050,a_,56
test0000002,10030010390,c_,55
test0000002,10030010390,b_,44
test0000002,10030010380,d_,41
test0000002,10030010380,a_,37
test0000002,10030010390,d_,35
test0000002,10030010380,c_,33
test0000002,10030010390,a_,31
test0000002,10030010320,c_,30
test0000002,10030010320,b_,27
test0000002,10030010380,b_,26
test0000002,10030010320,a_,23
test0000002,10030010320,d_,22
test0000002,10030010010,a_,6

我想要从第 2 列排序的第 4 列的最大值。

test0000002,10030010330,c_,218 
test0000002,10030010020,c_,178 
test0000002,10030010330,a_,166 
test0000002,10030010020,a_,151 
test0000002,10030070050,c_,119 
test0000002,10030010390,c_,55 
test0000002,10030010380,d_,41 
test0000002,10030010320,c_,30 
test0000002,10030010390,a_,31 
test0000002,10030010380,c_,33 
test0000002,10030010390,d_,35 
test0000002,10030010320,a_,23 
test0000002,10030010380,b_,26 
test0000002,10030010010,a_,6

【问题讨论】:

test0000002,10030010330,a_,166 是如何进入您的输出的,它们将被排序过滤掉!还要更详细地解释一下,“从第 2 列排序的第 4 列中的最高值”是什么意思? 对不起,我错了。 发布您的预期输出。 为什么包含166 行?它的第 2 列编号已经存在 218。 @choroba 10 分钟后... :-) 【参考方案1】:

您的文件似乎已经在第 4 列按降序排序,因此您只需打印第 2 列第一次出现的行:

awk -F, '!seen[$2]++' file
test0000002,10030010330,c_,218
test0000002,10030010020,c_,178
test0000002,10030070050,c_,119
test0000002,10030010390,c_,55
test0000002,10030010380,d_,41
test0000002,10030010320,c_,30
test0000002,10030010010,a_,6

如果您的输入文件未按第 4 列排序,则

sort -t, -k4nr file | awk -F, '!seen[$2]++'

【讨论】:

您的输入文件是否已预先排序?您的示例数据已预先排序。 谢谢我的朋友。这行得通。排序 -t, -k4nr 文件 | awk -F, '!seen[$2]++'【参考方案2】:

你可以使用两种:

sort -u -t, -k2,2 file | sort -t, -rnk4

第一个删除第二列中的重复项,第二个对第 4 列中的第一个进行排序。

【讨论】:

同样的结果。它总是打印相同的第三列。 a_ 适用于所有 7 行。 test0000002,010030010330,A_,166 test0000002,010030010020,A_,151 test0000002,010030070050,A_,56 test0000002,010030010380,A_,37 test0000002,010030010390,A_,31 test0000002,010030010320,A_,23 test0000002,010030010010,A_,6 那么请更好地解释这些行应该如何排序。

以上是关于从一列中打印具有最高值的整行的主要内容,如果未能解决你的问题,请参考以下文章

查找一个单词的多次出现并使用 c-sharp 打印出该单词所在的整行

如何根据列中的某个值为 ag 网格中的整行提供背景颜色?

SQL Server 2012 Express 如何从一列中提取信息并将其与具有表达式限制的另一列进行比较

在不循环的情况下将值更新到数据集中列中的整行

R:一次根据一列中的条件将整行推送到NA

根据其在另一列中的存在情况在 SQL 中打印值