Сброс счетчика при изменении во время чтения

У меня есть файл, содержащий что-то вроде следующего:

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  

Буду признателен за любые предложения :)

0
12.04.2017, 09:28
2 ответа

Примерно так с 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 отслеживает четыре вещи:

  1. Последнее прочитанное имя животного, a .
  2. Последний считанный цвет, c .
  3. «Счетчик животных», ac .
  4. «Счетчик цветов», куб.см .

Он обновляет эти переменные в зависимости от того, что находится в двух столбцах ввода.

  • Если цвет отличается от последнего прочитанного, увеличьте cc и запомните этот цвет. Также сбросьте ac и a .
  • Если животное отличается от того, что читали в последний раз, увеличьте ac и запомните это животное.

Затем выведите cc и ac для каждой строки ввода.

Если животные в каждой строке гарантированно уникальны, можно избавиться от переменной a .

1
28.01.2020, 02:46
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
0
28.01.2020, 02:46

Теги

Похожие вопросы