2013-02-20 94 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 
>