У меня есть файл, содержащий что-то вроде следующего:
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
Любые предложения будут ценны :)
решение1
Что-то вроде этого 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
.
Он обновляет эти переменные в зависимости от того, что обнаружено в двух столбцах входных данных.
- Если цвет не совпадает с тем, что вы недавно читали, увеличьте его
cc
и запомните.этотцвет вместо этого. Также сбросьтеac
иa
. - Если животное не совпадает с тем, что вы недавно читали, увеличьте его
ac
и запомните.этотвместо этого животное.
Затем выведите cc
и ac
для каждой строки ввода.
Если бы животные в каждой строке были гарантированно уникальными, можно было бы избавиться от этой a
переменной.
решение2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
Хеш %h
хранит keyA => count
и scalar keys %h
возвращает количество ключей в любой момент времени. Затем мы обращаем результат и соединяем их запятой.
Результат
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4