Как мне создать субартерий в awk? - PullRequest
1 голос
/ 23 августа 2011

Имеется такой список:

Dog bone
Cat catnip
Human ipad
Dog collar
Dog collar
Cat collar
Human car
Human laptop
Cat catnip
Human ipad

Как получить такие результаты, используя awk:

Dog bone 1
Dog collar 2
Cat catnip 2
Cat collar 1
Human car 1
Human laptop 1
Human ipad 2

Нужен ли подмассив?Мне кажется, что нужен массив «владельцев», который заполнен массивами «вещей».

Я бы хотел использовать для этого awk, так как это подстрочный индекс другой программы в awk.и сейчас я бы не хотел создавать отдельную программу.

Кстати, я уже могу сделать это, используя sort и grep -c, и несколько других каналов, но я действительно не смогу сделать это с гигантскими файлами данных, так как это будет слишком медленно,Мне говорят, что Awk обычно намного быстрее для таких вещей.

 Thanks, 
 Kevin

РЕДАКТИРОВАТЬ: Имейте в виду, что столбцы на самом деле не рядом друг с другом, как в настоящем файле, они большекак столбцы $ 8 и $ 11.Я говорю это, потому что, полагаю, если бы они были рядом друг с другом, я мог бы включить регулярное выражение awk ~ / Dog \ Collar / или что-то еще.Но у меня не будет такой возможности.-Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

awk не имеет многомерных массивов, но вы можете управлять, создавая ключи массива 2D-ish:

awk '{count[$1 " " $2]++} END {for (key in count) print key, count[key]}' | sort

который с вашего входа выводит

Cat catnip 2
Cat collar 1
Dog bone 1
Dog collar 2
Human car 1
Human ipad 2
Human laptop 1

Здесь я использую пробел для разделения значений ключа. Если ваши данные содержат пробелы, вы можете использовать какой-то другой символ, который не отображается при вводе. Обычно я использую array[$a FS $b], когда у меня есть определенный разделитель полей, так как это гарантированно не появится в значениях полей.

2 голосов
/ 23 августа 2011

GNU Awk имеет некоторую поддержку многомерных массивов , но на самом деле это просто умное объединение ключей для формирования своего рода составного ключа.

Я бы порекомендовал изучать Perl , который вам будет довольно знаком, если вам нравится awk, но Perl поддерживает истинные Списки списков . В общем, Perl перенесет вас намного дальше, чем awk.


Ваш комментарий:

Я не пытаюсь быть выше. Я понимаю, вы спросили, как выполнить задачу с помощью специального инструмента, awk. Я дал ссылку на документацию по моделированию многомерных массивов в awk. Но awk плохо справляется с этой задачей, и его фактически заменил Perl почти 20 лет назад.

Если вы спросите, как пересечь озеро на велосипеде, и я скажу вам, что в лодке будет легче, я не думаю, что это неразумно. Если я скажу вам, что сначала будет проще построить мост или изобрести транспортер «Звездный путь», тогда это будет неразумно.

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