2013-09-26 6 views
0

У меня эти данные в текстовом файле. что необходимо преобразовать, чтобы положить в шаблонеAwk пропуская пустые строки

data.txt

* A 11.22.33.44 
mail A 11.22.33.44 
domain1.com  A 11.22.33.44 
ftp  CNAME domain1.com 
www  CNAME domain1.com 
domain1.com MX mail.domain1.com 

* A 55.66.77.88 
mail A 55.66.77.88 
domain2.com  A 55.66.77.88 
ftp  CNAME domain2.com 
www  CNAME domain2.com 
domain2.com MX mail.domain2.com 

Запуск его хотя это vim команды

:g/NS/d | :%s/CNAME/cnamerecord/g | :%s/A/arecord/g | :%s/MX/mxrecord/g 

изменяет его:

arecord *    11.22.33.44 
arecord mail    11.22.33.44 
arecord domain1.com  11.22.33.44 
ftp  cnamerecord  domain1.com 
www  cnamerecord  domain1.com 
domain1.com mxrecord mail.domain1.com 

arecord *   55.66.77.88 
arecord mail    55.66.77.88 
arecord domain2.com    55.66.77.88 
ftp  cnamerecord  domain2.com 
www  cnamerecord  domain2.com 
domain2.com mxrecord mail.domain2.com 

Сейчас я введите команду AWK

cat data.txt | 
awk '{if ($2 == "arecord") print $2 " " $1 " " $3} 
    {if ($2 == "cnamerecord") print $2 " " $1 "." $3 " " $3} 
    {if ($2 == "mxrecord") print $2 " " $1 " " $3}' 

и выход заключается в следующем:

arecord * 11.22.33.44 
arecord mail 11.22.33.44 
arecord domain1.com 11.22.33.44 
cnamerecord ftp.domain1.com domain1.com 
cnamerecord www.domain1.com domain1.com 
mxrecord domain1.com mail.domain1.com 
arecord * 55.66.77.88 
arecord mail 55.66.77.88 
arecord domain2.com 55.66.77.88 
cnamerecord ftp.domain2.com domain2.com 
cnamerecord www.domain2.com domain2.com 
mxrecord domain2.com mail.domain2.com 

Теперь, есть две проблемы:

Проблема номер 1 и моя самая большая головная боль: как сделать так, чтобы пространство между данными. В файле, который я хотел бы сохранить, есть пустая строка.

Проблема № 2 (бонусные очки): в моем AWK код, который я хотел бы, ARecord, чтобы показать, как:

arecord *.domain1.com 55.66.77.88 
arecord mail.domain1.com 55.66.77.88 
arecord domain1 55.66.77.88 

НЕ:

arecord * 11.22.33.44 
arecord mail 11.22.33.44 
arecord domain1.com 11.22.33.44 

Окончательный идеальный результат будет выглядеть следующим образом

arecord *.domain1.com 11.22.33.44 
arecord mail.domain1.com 11.22.33.44 
arecord domain1.com 11.22.33.44 
cnamerecord ftp.domain1.com domain1.com 
cnamerecord www.domain1.com domain1.com 
mxrecord domain1.com mail.domain1.com 

arecord *.domain2.com 55.66.77.88 
arecord mail.domain2.com 55.66.77.88 
arecord domain2.com 55.66.77.88 
cnamerecord ftp.domain2.com domain2.com 
cnamerecord www.domain2.com domain2.com 
mxrecord domain2.com mail.domain2.com 

Я должен это сделать для 150 доменов

Любая помощь будет замечательной

+1

Это не будет очень далеко, без правильного форматирования. Не могли бы вы правильно отформатировать? – iruvar

ответ

2

Если вы присоединитесь отдельное if заявления к if..else if..else, вы можете добавить запасной вариант для печати всех остальных строк асов- является; это будет содержать пустые строки (а также любые строки комментариев и т. д.):

cat data.txt | awk '{if ($2 == "arecord") print $2 " " $1 " " $3; else if ($2 == "cnamerecord") print $2 " " $1 "." $3 " " $3; else if ($2 == "mxrecord") print $2 " " $1 " " $3; else print}' 
+0

Это одно из заданий, которое оно по-прежнему не помещает в исходное положение, однако оно очень близко к тому, что мне нужно, спасибо –

+0

Да, я заметил, что при тестировании тоже; условие, вероятно, должно быть 'if ($ 1 ==" arecord ") ...'; Я думаю, вы можете понять это! –

+0

Вы не должны использовать 'cat' с программой, которая может считывать данные самостоятельно, например' awk': 'awk 'code' data.txt'. И это не дает результат, как запрошено OP. Не добавлять 'domain1.com' в' * 'и' mail' – Jotne

2

Некоторые из этого:

cat file 
arecord * 11.22.33.44 
arecord mail 11.22.33.44 
arecord domain1.com 11.22.33.44 
ftp cnamerecord domain1.com 
www cnamerecord domain1.com 
domain1.com mxrecord mail.domain1.com 

arecord * 55.66.77.88 
arecord mail 55.66.77.88 
arecord domain2.com 55.66.77.88 
ftp cnamerecord domain2.com 
www cnamerecord domain2.com 
domain2.com mxrecord mail.domain2.com 

Команда AWK

awk ' 
/arecord/ && !c { 
    c=NR+2} 
NR==c { 
    c=0 
    print $1 " *." $2,$3 "\n" $1" mail." $2,$3 "\n" $0} 
/^ftp|^www/{ 
    print $2,$1 "." $3,$3} 
/mxrecord/ { 
    print $2,$1,$3} 
!NF { 
    print ""} 
' file 
arecord *.domain1.com 11.22.33.44 
arecord mail.domain1.com 11.22.33.44 
arecord domain1.com 11.22.33.44 
cnamerecord ftp.domain1.com domain1.com 
cnamerecord www.domain1.com domain1.com 
mxrecord domain1.com mail.domain1.com 

arecord *.domain2.com 55.66.77.88 
arecord mail.domain2.com 55.66.77.88 
arecord domain2.com 55.66.77.88 
cnamerecord ftp.domain2.com domain2.com 
cnamerecord www.domain2.com domain2.com 
mxrecord domain2.com mail.domain2.com 

Обновлено избавиться от getline

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