У меня есть файл, содержащий что-то вроде следующего:
red dog
red cat
red bird
red horse
blue hamster
blue monkey
blue lion
pink pony
pink whale
pink pig
pink dolphin
Мне нужно увеличить счетчик для каждого цвета, а затем для каждого животного. Таким образом, красный будет 1, синий 2, розовый 3. Затем собака, кошка, птица и лошадь будут 1, 2, 3 и 4. Мне нужно, чтобы хомяк снова начал с 1, потому что мы начинаем новый цвет.
Если я выполняю «во время чтения цветное животное» указанного файла, что я могу сделать для сравнения, когда цвет больше не равен предыдущему цвету?
Я ищу что-то вроде этого:
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
Буду признателен за любые предложения :)
Примерно так с awk
:
$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
Скрипт awk
отслеживает четыре вещи:
a
. c
. ac
. куб.см
. Он обновляет эти переменные в зависимости от того, что находится в двух столбцах ввода.
cc
и запомните этот цвет. Также сбросьте ac
и a
. ac
и запомните это животное. Затем выведите cc
и ac
для каждой строки ввода.
Если животные в каждой строке гарантированно уникальны, можно избавиться от переменной a
.
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
Хэш % h
содержит keyA => count
и скалярные ключи.% H
возвращает количество ключей в любой момент во время. Затем переворачиваем результат и соединяем их запятой.
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4