Пробуждение к среднему столбцу на основе ключа во 2-м столбце

я имею

Sample_A 100 Sample_A 200 Sample_B 300 Sample_B 100 

И я хочу напечатать среднее значение в строке 2 для каждого ключа в строке 1

 Sample_A 150 Sample_B 200 

Я могу напечатать суммы значений в строке 2 для каждого ключа в строке 1, используя превосходный ответ на другой вопрос: Сумма первого столбца на основе второго столбца

Команда:

 awk 'NR { k = $1; cnt[k] += $2 } END { print; for (k in cnt) print k,cnt[k]}' File.txt 

И это производит

 Sample_A 300 Sample_B 400 

Но для того, чтобы вычислить среднее значение, мне нужен способ сохранить количество вхождений ключа, что-то вроде

 awk 'NR { k = $1; cnt[k] += $2; count(k)=$2} END { print; for (k in cnt) print k,cnt[k]/count(k)}' File.txt 

Но мой код count(k) является своего рода выстрелом в темноте и не работает.

2 Solutions collect form web for “Пробуждение к среднему столбцу на основе ключа во 2-м столбце”

С помощью awk вы можете сделать:

 awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' infile Sample_A 150 Sample_B 200 

Или используя GNU datamash :

 datamash -t' ' --sort --group 1 mean 2  
 $ awk '{ sum[$1] += $2; count[$1] += 1 } END { for ( key in count ) { print key, sum[key] / count[key] } }' input Sample_A 150 Sample_B 200 

Чтобы получить среднее значение, вам нужно две вещи: количество усредненных сущностей и сумма этих значений. Мы используем массив, count для первого и sum массива для последнего. Ключи в каждом массиве назначены первому столбцу в вашем файле данных.

Затем мы используем предложение END после сбора данных, чтобы просмотреть каждый массив, чтобы получить суммы и счетчики, разделить одно на другое и отобразить результаты.

Скрипт awk , переформатированный так, чтобы не все располагаться на одной строке, выглядит следующим образом:

 { sum[$1] += $2 count[$1] += 1 } END { for (key in count) { print key, sum[key] / count[key] } } 
  • как напечатать только часть каждой строки, которая помечается определенным символом
  • Группировка в строки на основе того же последнего столбца
  • Рекурсивно найти и заменить содержимое одного файла, используя ключ из другого файла
  • объединение двух файлов в соответствии с указанной строкой
  • Удалить строковый файл после пробела
  • Как объединить первые две строки CSV столбец за столбцом?
  • Сед условное удаление ЭОЛ
  • REGEX поиск и замена с помощью sed или другой команды
  • Поиск греческого из командной строки
  • Заменить строку перед определенной строкой
  • Как переместить строку из файла в другой файл на основе сопоставления с образцом?
  • Linux и Unix - лучшая ОС в мире.