bash - 如何使用awk根据前两个字段找出第三个字段的最小值
问题描述
文件名test.file
的内容如下:
333379266 834640619 88
333379280 834640621 99
333379280 834640621 66
333376672 857526666 99
333376672 857526666 78
333376672 857526666 62
前两列可能重复,我想输出前两列和第三列对应的最小值。在这种情况下,结果文件应该如下:
333379280 834640621 66
333379266 834640619 88
333376672 857526666 62
我的尝试是:
awk '{a[$1" "$2]=99999;a[$1" "$2]=a[$1" "$2]<$3?a[$1" "$2]:$3}END{for(i in a) print i,a[i]}' test.file
我的问题是:
有没有other way
达到这个要求。
解决方案
您能否尝试在整个 Input_file 中查找第一个和第二个字段键的最小值。
awk '
{
ind=$1 OFS $2
array[ind]=(array[ind]<$3?(array[ind]?array[ind]:$3):$3)
}
END{
for(i in array){
print i,array[i]
}
}' Input_file
或根据@kent 的评论添加以下解决方案和附加条件以检查第三个字段中的空值,如下所示。
awk '
{
ind=$1 OFS $2
array[ind]=(array[ind]<$3||array[ind]==""?(array[ind]?array[ind]:$3):$3)
}
END{
for(i in array){
print i,array[i]
}
}' Input_file
说明:为上述代码添加详细说明。
awk ' ##Starting awk program from here.
{
ind=$1 OFS $2 ##Creating variable ind whose value is 1st and 2nd field.
array[ind]=(array[ind]<$3?(array[ind]?array[ind]:$3):$3) ##Creating array with index of variable ind and checking if its value is lesser than $3 then keep it same else assign $3 to it.
}
END{ ##Starting END block for this awk program here.
for(i in array){ ##Traversing through all elements of array here.
print i,array[i] ##Printing key of array and value of array here.
}
}' Input_file ##Mentioning Input_file name here.
推荐阅读
- c# - 从动态导入的 DLL 加载 EF Core 2 DbContext
- mysql - 使用相似的 ITEM_ID 更改 SQL 输出
- php - 使用 php 从 json wikivoyage 获取数据
- solr - 复制了 solr 数据/索引,但未显示
- routing - 如何从 MapBox Directions API 查询距离优化路线?
- python - 通过连续加载多个帧,使用 Tkinter 在 Python 中运行 GIF
- javascript - node.js - 以类似于 PHP 的方式加载 html
- javascript - Watson 助手如何区分不同的用户
- yii2 - Yii2 - 拦截渲染动作
- javascript - 将 MySQL 数据传递给 Javascript