我有多个名称和数字的文件:
Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246
我想对每个uniq第一列值的第二列求和?所以 约兰达606 + 669 + 713 =
Yolanda 1988
Yoselin 965
如果任何约兰达是<= 200?
,我还想删除每一个约兰达编辑:我为不清楚而道歉,但有超过一百万条记录和数十万个名字。 Yolanda是一个例子,我希望能够为任何给定的'$ 1 == string'执行这些操作。两个单独的awk命令会更好,所以我可以告诉你发生了什么。
答案 0 :(得分:1)
这样做:
awk '! ($1 !~ /Yolanda/ && $2 <= 200) {
arr[$1] += $2
} END {
for (i in arr)
printf("%s %d\n", i, arr[i]); }' file.txt
它会在您的示例输入中生成以下内容:
Zaniyah 246
Yuridia 241
Yuliana 500
Yolanda 1988
Yoselin 965
如果您有gawk
可用,则可以使用它的asorti
函数按字母顺序重新命名:
awk '! ($1 !~ /Yolanda/ && $2 <= 200) {
arr[$1] += $2
} END {
n = asorti(arr, sorted)
for (i = 1; i <= n; i++)
printf("%s %d\n", sorted[i], arr[sorted[i]]); }' file.txt
答案 1 :(得分:1)
假设您的数据位于 data.txt :
awk '$2>200{sum[$1]+=$2} END {for(name in sum){print name,sum[name]}}' data.txt
答案 2 :(得分:1)
如果任何值小于200
,这将删除总数$ cat infile
Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246
blabla 199
blabla 800
$ awk '{T[$1]+=$2} $2<200{E[$1]} END{for(i in T) if (!(i in E)) print i,T[i]}' infile
Yuridia 241
Yoselin 965
Zaniyah 246
Yolanda 1988
Yuliana 500
答案 3 :(得分:0)
这样做:
awk '{if($0~/Yolanda/&&$2<=200){next}a[$1]+=$2;}END{for(i in a) print i,a[i]}' your_file
测试:
> cat temp
Yolanda 199
Yolanda 606
Yolanda 669
Yolanda 713
Yoselin 301
Yoselin 312
Yoselin 352
Yuliana 249
Yuliana 251
Yuridia 241
Zaniyah 246
> awk '{if($0~/Yolanda/&&$2<=200){next}a[$1]+=$2;}END{for(i in a) print i,a[i]}' temp
Yolanda 1988
Yuliana 500
Zaniyah 246
Yuridia 241
Yoselin 965
>