我有以下内容的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
我的问题是:有没有更有效的方法?我能说出这个人和城市的名字吗?谢谢
答案 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
$ datamash -t: -s -g4 min 2 < ip.txt
Brasilia:69
Miami:16
Paris:21
但是,据我从手册中了解到,它不允许仅打印特定字段