У меня есть большой файл в следующем формате:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Если значения в столбце 2 совпадают, я хочу суммировать значения в столбцах 3 и 4 обеих строк, иначе просто сумму значений в уникальной строке.
Итак, результат, на который я надеюсь, будет выглядеть так:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Я могу сортировать файлы по столбцу 2 с awk
или sort
и суммировать последние столбцы с awk
, но только для отдельных строк, а не для двух строк, где столбец 2 совпадает.
text-processing
awk
sort
uniq
TomPio
источник
источник
$1 $2
как ключ.Ответы:
Я бы сделал это в Perl:
Или awk:
Если вы хотите, чтобы выходные данные были отсортированы в соответствии со вторым столбцом, вы можете просто направить
sort
:Обратите внимание, что оба решения включают 1-й столбец. Идея состоит в том, чтобы использовать первый и второй столбцы в качестве ключей для хеша (в perl) или ассоциативного массива (в awk). Ключ в каждом решении
column1 column2
таков: если две строки имеют одинаковый столбец два, но другой столбец один, они будут сгруппированы отдельно:источник
Может быть, это может помочь, но всегда ли столбец 1 равен 2 и зависят ли результаты от этого?
или как упомянуто Гленном Джекманом в комментариях о сортировке:
источник
PROCINFO["sorted_in"] = "@ind_num_asc"
вместо конвейераsort
. ref gnu.org/software/gawk/manual/html_node/…Вы можете предварительно отсортировать данные и позволить awk обработать детали:
Вы можете сбросить аккумулятор:
Выход:
Если вы действительно хотите сохранить первый столбец, сделайте что-то вроде этого:
Выход:
объяснение
p
Переменная содержит$2
значение предыдущей строки, или$1FS$2
во втором случае выше. Это означает, что{print p,s}
срабатывает, когда$2
предыдущая строка отличается от текущей строки (p!=$2
).источник
sort -k2
сортировку по второму столбцуИспользование швейцарского армейского ножа
mlr
:Выход:
Заметки:
--nidx
говоритmlr
использовать числовые имена полей.put '$5=$3+$4'
делает новое 5-е поле, сумма полей 3 и 4 .stats1
Функция (или « глагол ») является меньшим швейцарским армейским ножомв большем швейцарском армейском ноже
mlr
, с несколькими функций на основе аккумуляторных , такие какsum
,count
,mean
, и т.д.stats1 -g 1,2
группирует данные по столбцам 1 и 2 , а-f 5 -a sum
затем складывает поле 5 этих групп .stats1
печатает только именованные поля.источник