борьба с awk

Проблема:

У меня есть файл, как показано ниже, с несколькими цифрами и символами

  1. поле: нет времени IP найден ( 69.175.54.106 = 17 )
  2. : IP-адрес,
  3. : название страны ( US - Америка, CN - Китай и т. д.),

Если вы видите ниже IP 69.175.54.106 было разрешено 283 раза, но не для 17, поэтому я хочу, чтобы сумма первого поля с совпадающим вторым поданным и третьим полем должна быть там как название страны

17, 69.175.54.106,
283, 69.175.54.106, US
77, 58.77.59.10, CN
23, 58.77.59.10, 

Результат должен выглядеть так:

300, 69.175.54.106, US
100, 58.77.59.10, CN
3
nl ja de
Нет, awk - идеальное решение для такого рода работ.
добавлено автор Zsolt Botykai, источник
Попробуйте использовать язык, подобный python, для решения этой проблемы
добавлено автор sureshvv, источник

1 ответы

Что-то вроде этого может сработать для вас:

awk 'BEGIN {FS=", *"}
{sum[$2]+=$1 }
! country[$2] && $3 != "" {country[$2] = $3}
END { for ( k in sum ) { print sum[k] ", " k ", " country[k] } }' INPUTFILE

See it in action at Ideone.com.

Построчно

  1. в блоке BEGIN настройте разделитель полей (чтобы избавиться от нежелательных пробелов)
  2. для каждой строки добавьте время к массиву, проиндексированному IP
  3. если код страны еще не был сохранен, а третий файл не пуст, сохраните его в другом массиве (индексируется по IP)
  4. Наконец, для каждого IP распечатывают сумму, IP и код страны.
2
добавлено
Это зависит. Что, если код страны уже был сохранен и другой?
добавлено автор Zsolt Botykai, источник
Láttál-e már karón varjút :-) (глупая венгерская шутка о невозможных вещах). Я предпочитаю первый, потому что он был указан иначе.
добавлено автор Zsolt Botykai, источник
вы можете удалить ! страна [$ 2] && .
добавлено автор Karoly Horvath, источник
один ИС разрешен в двух разных странах? ;) и даже в этом случае .. почему вы предпочтете первую запись?
добавлено автор Karoly Horvath, источник