Найдите минимальные значения в поле 2, просматривая определенное количество записей с помощью AWK

У меня есть три поля в файле набора данных.

поле 1 действует как идентификатор

поле 2 используется для сравнения мин

поле 3 имеет логическое значение 0 или 1.

Мне нужно найти минимальное значение в поле 2, но по отношению к полю 1. то есть рассмотрим ниже набор данных.

Набор данных

1 0.432 0 
1 0.12  1
1 0.298 0
2 0.056 0
2 0.06  1
3 0.982 0

Мне нужно сравнить значения в поле 2 для первых 3 записей и проверить, имеет ли поле 3 значение = 1 для минимального значения в поле 2. если это так, ++count.

Затем снова найдите min в поле 2, но для записей с полем 1 = 2. то есть только записи 4 и 5. и так далее...

Каков был бы лучший способ пойти с этим? Файл содержит около 2 000 000 записей.

Можно ли отсортировать поле 2, а затем взять одну запись для каждого отдельного значения поля field1?

1 ответ

Решение

Самый легкий...

$ sort -n file | awk '!a[$1]++'

1 0.12  1
2 0.056 0
3 0.982 0

посчитать сумму

$ sort -n file | awk '!a[$1]++{sum+=$3} END{print sum}'
1

однако, если есть совпадение во втором поле, и вы хотите выбрать запись с последним полем 1, вы должны выполнить обратную сортировку для поля 3, т.е. sort -k1,2n -k3r

объяснение

!a[$1]++ является awk идиома выбора первой уникальной записи для поля 1. Создание счетчика, сопоставленного с ключом, логически будет истинно только для первой записи (из-за отрицания и автоматического преобразования значений в логическое значение)

сортировка: первые два поля в порядке возрастания (но числовая сортировка так, что 2 < 11), третье - в порядке убывания (обратный), так что 1 будет отображаться до 0. Поскольку последнее поле является одной цифрой, только числовая или лексическая сортировка не имеет значения, в противном случае вы тоже хотите, чтобы он был числовым.

Другие вопросы по тегам