0

我有多个带有名称和数字的文件:

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

如果任何 Yolanda <= 200,我还想删除每个 Yolanda?

编辑:我很抱歉不清楚,但有超过一百万条记录和数十万个名字。Yolanda 是一个示例,我希望能够对任何给定的 '$1 == string' 执行这些操作。两个单独的 awk 命令会更好,所以我可以知道发生了什么。

4

4 回答 4

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
于 2013-02-20T05:58:39.233 回答
1

假设您的数据在data.txt中:

awk '$2>200{sum[$1]+=$2} END {for(name in sum){print name,sum[name]}}' data.txt 
于 2013-02-20T06:04:01.990 回答
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
于 2013-02-20T14:29:29.097 回答
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
> 
于 2013-02-20T12:52:22.483 回答