2013-02-20 101 views
0

我有名字的多个文件和数字:AWK搜索字段递归?

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 ==字符串'执行这些操作。两个单独的awk命令会更好,所以我可以告诉发生了什么。

+0

这是“ = Yo'特定于Yolanda的规则,还是适用于任何名字? – 2013-02-20 06:01:07

+0

如果规则确实适用于任何名称,规则是否适用于总结之前或之后? – Steve 2013-02-20 06:22:09

+1

你的编辑没有使任何更清楚。 – jordanm 2013-02-20 06:27:23

回答

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

假设您的数据在data.txt中

awk '$2>200{sum[$1]+=$2} END {for(name in sum){print name,sum[name]}}' data.txt 
+0

这将排除超过200的所有值,而不仅仅是“Yolanda”的值超过200. – jordanm 2013-02-20 06:07:56

+0

我明白,但我不知道<= 200规则是否适用于“Yolanda”或所有名称。现在,我假设所有的名字。 – 2013-02-20 06:15:10

+0

这几乎是我在寻找的东西我认为,我试图逐行执行,但您只需将数据放入数组并打印数组。非常酷和教学。如果一个副本<200,是否删除名称的所有副本;还是只是跳过添加该记录的字段? – Lochlan 2013-02-20 06:37:53

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 
>