AWK搜索字段递归?

时间:2013-02-20 05:47:09

标签: bash awk gawk

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

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命令会更好,所以我可以告诉你发生了什么。

4 个答案:

答案 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
>