Как удалить выделенные строки скриптом awk? - PullRequest
1 голос
/ 29 октября 2009

Я передаю вывод программы через некоторые команды awk, и я почти там, где мне нужно. Команда на данный момент:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

Последний бит - uniq для бедняка, которого нет у моей цели. При условии, что приведенная выше команда выдаст такой результат:

GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2

Что бы я хотел иметь, это:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

То есть я хотел бы напечатать только строку, которая имеет максимальное значение для данного тега (первое «поле»). Приведенный выше пример представляет данные at в том смысле, что выходные данные будут отсортированы (как если бы они были переданы через команду sort).

Ответы [ 2 ]

2 голосов
/ 30 октября 2009

Исходя из моего ответа на аналогичную потребность, этот скрипт поддерживает порядок и не накапливает большой массив. Он печатает строку с наибольшим значением из каждой группы.

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}
1 голос
/ 29 октября 2009

Если вам не нужно, чтобы элементы были в том же порядке, в котором они были выведены из myprogram, работает следующее:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...