AWK-每个项目的最小值

时间:2018-08-13 21:34:03

标签: awk

我有以下内容的data.txt文件:

Claude:41:166:Paris
John:37:185:Miami
Lina:16:170:Miami
Maurice:58:172:Paris
Phoebe:21:179:Paris
Anthony:69:165:Brasilia

作为第一个冒号之后的数字,我试图通过以下方式获得每个城市中最年轻的人的名字:

sort -t ":" -k4,1 -k2,2 datos.txt |  awk -F ':' '!a[$4]++' | sort -t ":" -k4

我的问题是:有没有更有效的方法?我能说出这个人和城市的名字吗?谢谢

5 个答案:

答案 0 :(得分:2)

您可以完全在awk中完成此操作。使用一个数组保存每个城市的最小年龄,然后使用另一个数组保存该年龄的人的姓名。

awk -F: '!age[$4] || $2 < age[$4] { age[$4] = $2; name[$4] = $1; }
         END {for (city in name) print city, name[city] }' datos.txt

答案 1 :(得分:0)

要获取姓名,您可以在relation_subnet = nx.Graph([(u,v,d) for (u, v, d) in relation_net.edges( data = True) if u == node or v == node]) 上拆分,然后仅打印第1部分和第4部分,例如['Samantha', 'Jill', 'John']

给予:

family

答案 2 :(得分:0)

请您尝试以下。

awk -F':' '
{
  age[$NF]=($2>age[$NF]?(age[$NF]?age[$NF]:$2):$2)
  person[$NF]=($2>age[$NF]?(person[$NF]?person[$NF]:$NF):$1)
}
END{
  for(i in person){
    print i,person[i],age[i]
  }
}'  Input_file

输出如下。

Miami Lina 16
Brasilia Anthony 69
Paris Phoebe 21

如果您不想打印人的年龄,也可以在age[i]的{​​{1}}块的print语句中删除END

答案 3 :(得分:0)

没有awk

$ sort -t: -k4,4 -k2,2 file |  # sort by city, age
  tr ':' ' '                |  # replace delimiter
  uniq -f3                  |  # take the min for each city
  tr ' ' ':'                   # replace delimiter back

Anthony:69:165:Brasilia
Lina:16:170:Miami
Phoebe:21:179:Paris

答案 4 :(得分:0)

您只能在awk中打印必填字段,因为第一个sort已经指定了顺序,所以无需进一步排序

$ # printing required field with space between (default OFS)
$ sort -t: -k4,4 -k2,2 ip.txt | awk -F: '!a[$4]++{print $1, $4}'
Anthony Brasilia
Lina Miami
Phoebe Paris

$ # printing with : between fields
$ sort -t: -k4,4 -k2,2 ip.txt | awk -F: '!a[$4]++{print $1 ":" $4}'
Anthony:Brasilia
Lina:Miami
Phoebe:Paris


使用GNU datamash

$ datamash -t: -s -g4 min 2 < ip.txt 
Brasilia:69
Miami:16
Paris:21

但是,据我从手册中了解到,它不允许仅打印特定字段