2016-10-12 2 views
1

Мне нужна помощь с нумерацией нужной записи в текстовом файле. Это файл ldif, и он будет около 2 ГБ. Машина обработки unix поэтому я набрал awk. Хотя уже пробовал nl и cat, он выглядит более сложным и awk выглядит хорошо для этой задачи, я знаком с sql, но это не близко к нему :-)Номер строки повторения Unix для каждой группы в файле на основе patern probabelly с awk

Цель состоит в том, чтобы гарантировать числовую уникальность для группы и элементов группы :

  1. Добавить столбец с повторяющимся номером в каждую строку в группе данных, начиная с атрибута 'dn:' (это может быть номер строки или счетчик строк). Важно то, что она должна быть уникальной среди групп.
  2. Добавить столбец с инкрементным номером, когда атрибут повторяется.

Вход:

dn: uc=an 
version: 12 

dn: uid=fcb 
uid: ljfhsfff 
missdata: at12 
missdata: at3 
fladata: part2 
fladata: part3 
fladata: part1 

dn: uid=fccb 
uid: kjhfa8 
missdata: at1 
missdata: at8 
missdata: at10 
missdata: at14 
fladata:: a06b6a== 
fladata: part3 
att: dsc 

выход (один из возможных):

1 1 dn: uc=an 
1 1 version: 12 

2 1 dn: uid=fcb 
2 1 uid: ljfhsfff 
2 1 missdata: at12 
2 2 missdata: at3 
2 1 fladata: part2 
2 2 fladata: part3 
2 3 fladata: part1 

3 1 dn: uid=fccb 
3 1 uid: kjhfa8 
3 1 missdata: at1 
3 2 missdata: at8 
3 3 missdata: at10 
3 4 missdata: at14 
3 1 fladata:: a06b6a== 
3 2 fladata: part3 
3 1 att: dsc 

ответ

2
$ awk -F':' '{if (NF) {$0 = (grpNr+1) OFS (++eltCnt[$1]) OFS $0} else {++grpNr; delete eltCnt}} 1' file 
1 1 dn: uc=an 
1 1 version: 12 

2 1 dn: uid=fcb 
2 1 uid: ljfhsfff 
2 1 missdata: at12 
2 2 missdata: at3 
2 1 fladata: part2 
2 2 fladata: part3 
2 3 fladata: part1 

3 1 dn: uid=fccb 
3 1 uid: kjhfa8 
3 1 missdata: at1 
3 2 missdata: at8 
3 3 missdata: at10 
3 4 missdata: at14 
3 1 fladata:: a06b6a== 
3 2 fladata: part3 
3 1 att: dsc 
+1

Видел ваши ответы ранее - Вы лучшие. Он работает так, как ожидалось, в linux, но это солярис, поэтому догадка должна заменить delete eltCnt на split ("", array, ":") и, вероятно, правильно использовать nawk? – jareeq

+1

В Solaris вы должны использовать/usr/xpg4/bin/awk, а не nawk (pre-POSIX) и определенно не/bin/awk (старый, сломанный awk). Да, вам НЕОБХОДИМО использовать 'split, ', eltCnt' вместо' delete eltCnt', но сначала попробуйте последний. Вам не понадобится 3rg arg для split(), если вы его использовали. –

+0

Еще раз спасибо Эд, я нашел эту версию вчера и реализовал 'delete'. Тем временем я ознакомился с awk и понял, что могу напрямую привязывать данные от ldif к csv. На основе примеров у меня уже работает скрипт, но, к сожалению, он работает с несколькими атрибутами с таким же именем (как указано выше). Я попытаюсь понять это или задать новый вопрос с тем, что я уже сделал. – jareeq

Смежные вопросы