Вы можете делать все, что вам нужно, читая строки в пару массивов с awk
, а затем циклически перебирая сохраненные строки в правиле END
и назначая значение суффикса для каждого элемента массива, который появляется более одного раза (увеличение значение суффикса 100
каждый раз)
В секции нормальных правил требуются два массива: массив order[]
, в котором хранится порядок строк, поэтому они могут выводиться в одном и том же порядке (awk
массивы являются ассоциативными), а затем массив seen[]
, который ведет подсчет количества раз, когда первый текст столбца просматривается. В разделе END
вы присваиваете суффикс массиву, индексированному по значениям, видимым более одного раза, чтобы вы могли выводить, например, 100
для каждого раза, когда просматривается "Alice,"
и 200
для "Bob,"
, et c ...
Сценарий awk
будет выглядеть следующим образом:
awk '{ order[++n] = NF>1 ? $0 : $1; seen[$1]++ }
END {
sfx=100
for (i=1;i<=n;i++)
if (seen[order[i]] > 1) {
order[i] in val || val[order[i]]=sfx
print order[i]" "val[order[i]]+0
sfx+=100
}
else
print order[i]
}' file
Пример использования / Вывод
Вы можете просто скопировать и переместить -mouse-вставить скрипт в xterm в каталог, содержащий ваш входной файл. При вводе выше в file
вы получите:
$ awk '{ order[++n] = NF>1 ? $0 : $1; seen[$1]++ }
> END {
> sfx=100
> for (i=1;i<=n;i++)
> if (seen[order[i]] > 1) {
> order[i] in val || val[order[i]]=sfx
> print order[i]" "val[order[i]]+0
> sfx+=100
> }
> else
> print order[i]
> }' file
cul1, cul2
Alice, 100
Bob, 200
John,
Alice, 100
Bob, 200
Alex,
, который обеспечивает запрошенный вывод. Посмотрите вещи и дайте мне знать, если у вас есть вопросы.