Найдите минимальные значения в поле 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. Поскольку последнее поле является одной цифрой, только числовая или лексическая сортировка не имеет значения, в противном случае вы тоже хотите, чтобы он был числовым.