SED: вставка существующего шаблона в несколько других мест на одной строке - PullRequest
0 голосов
/ 22 марта 2012

Снова вопрос SED от меня:)

Так же, как и в прошлый раз, я борюсь с номерами телефонов.На этот раз проблема немного в другом.Такая организация в настоящее время находится в моем текстовом файле:

Areacode:    List of phone numbers:
4444         NUM:111111  NUM:2222222 NUM:33333333
5555         NUM:1111111 NUM:2222    NUM:3333333  NUM:44444444 NUM:5555555

Теперь у каждого ареакода может быть неизвестное количество номеров, а также номера телефонов не имеют фиксированной длины.Что я хотел бы знать, так это то, как я могу объединить areacode и номер телефона, чтобы выглядеть примерно так:

4444-111111, 4444-2222222, 4444-33333333

Моя первая идея состояла в том, чтобы снова добавить разрыв строки перед каждым номером телефона и сопоставить ихразделы с регулярным выражением, а затем просто добавьте первый запомненный элемент ко второму и с первого по третий:

\1-\2, \1-\3, etc

Но, конечно, поскольку sed может запомнить только 9 аргументов, и в одном может быть более 10 чиселлиния это не работает.Более того, нефиксированный список телефонных номеров не позволял это делать.Я снова обращаю внимание, прежде всего, на вариант SED, так как я пытался освоить его, но, безусловно, приветствуются более эффективные решения с другими инструментами!

Ответы [ 3 ]

2 голосов
/ 22 марта 2012
$ cat input.txt | sed '1d;s/NUM:/ /g' | awk '{for(i=2;i<=NF;i++)printf("%s-%s%s", $1, $i, i==NF?"\n":",")}'
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555
1 голос
/ 22 марта 2012

Это может работать для вас:

sed '1d;:a;s/^\(\S*\)\(.*\)NUM:/\1\2,\1-/;ta;s/[^,]*,//;s/ //g' file
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555

или:

awk 'NR>1{gsub(/NUM:/,","$1"-");sub(/[^,]*,/,"");gsub(/ /,"");print}' file
4444-111111,4444-2222222,4444-33333333
5555-1111111,5555-2222,5555-3333333,5555-44444444,5555-5555555
0 голосов
/ 28 марта 2012

TXR:

@(collect)
@area @(coll :mintimes 1)NUM:@{num /[0-9]+/}@(end)
@(output)
@(rep)@area-@num, @(last)@area-@num@(end)
@(end)
@(end)

Пробег:

$ txr phone.txr phone.txt
4444-111111, 4444-2222222, 4444-33333333
5555-1111111, 5555-2222, 5555-3333333, 5555-44444444, 5555-5555555

$ cat phone.txt
Areacode:    List of phone numbers:
4444         NUM:111111  NUM:2222222 NUM:33333333
5555         NUM:1111111 NUM:2222    NUM:3333333  NUM:44444444 NUM:5555555
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...