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

Я также хотел бы, чтобы удалить все Иоланда если Yolanda является < = 200?

Редактировать: Я прошу прощения за то, что не ясен, но есть более миллиона записей и сотни тысяч имен. Yolanda был примером, я хотел бы иметь возможность выполнять эти операции для любой заданной строки $ 1 ==. две отдельные команды awk были бы лучше, поэтому я могу сказать, что происходит.

+0

Является ли это ' <= 200' правило, характерное для Yolanda, или оно применяется к любому имени? –

+0

Если правило применяется к любому имени, применяется ли правило до или после суммирования? – Steve

+1

Ваше правление не делало ничего более ясного. – jordanm

ответ

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

+0

Я понимаю, но я не знаю, применимо ли правило <= 200 только к «Yolanda» или ко всем именам. Прямо сейчас, я принимаю все имена. –

+0

Это почти то, что я искал, я думаю, я пытался это делать по строкам, но вы просто помещали данные в массив и печатали массив. Очень круто и учебно. Удаляет ли он все копии имени, если один экземпляр <200; или просто пропустить добавление поля этой записи? – Lochlan

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 
> 
Смежные вопросы