2013-08-26 2 views
0

Я хотел бы, чтобы удалить дубликаты из набора данных, который имеет 3 колонкиудаление дубликатов на основе состояния AWK/Баш

A  0 3238 
B  0 3367 
C  0 3130 
D  1 3130 

Мне нужно удалить строки, содержащие повторяющиеся значения в третьем столбце, но предпочтительно держать те, с значение «1» во втором столбце. Я знаю, как удалить дубликаты с помощью awk, но я не могу понять, как добавить условный статус.

Благодаря

ответ

3

дают эту линию попробовать:

awk '{if($3 in a)a[$3]=$2==1?$0:a[$3];else a[$3]=$0}END{for(i in a)print a[i]}' file 
+0

Спасибо, это похоже на работу! – tclarke

+0

@tclarke pls принимает ответ. – user1502952

+0

+1 для аккуратного способа его решения. Я сначала не понял, что '$ 2 == 1? $ 0: [$ 3]' оценивается до '=' желания, немного запутанного. Я думаю, что 'a [$ 3] = ($ 2 == 1? $ 0: a [$ 3])' будет работать. – Qben

3
$ sort -k2nr file | awk '!seen[$3]++' 
D  1 3130 
A  0 3238 
B  0 3367 
+1

Интересные биты 'awk'. Не могли бы вы объяснить часть '! Seen [$ 3] ++'? – iamauser

+1

Это обычная awk-идиома, которая выводит только первое значение из серии потенциальных дубликатов. Каждый раз, когда значение используется как индекс в массиве, запись массива для этого значения выполняется после инкремента, поэтому в первый раз, когда значение видно, оно равно нулю, поэтому оператор '!' Делает общий результат истинным. После этого первого раза, хотя запись массива отлична от нуля, поэтому '!' Делает результат ложным. Это похоже на 'uniq', но не требует сортировки значений и позволяет вам работать с полями, а не по всей строке ввода/записи. –

Смежные вопросы