2013-09-26 61 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 

NOT:

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

,你可以添加一個備用打印所有其他線路原樣是;這將保留空行(以及任何註釋行等):

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

這一個是做的工作,它仍然沒有把arecords在正確的位置,但它是非常接近我需要感謝你 –

+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 

更新如果加入單獨if語句的if..else if..else擺脫getline