2016-01-29 29 views
2

我试图将平面文件数据库filename=iplocationdata重新组合成部分。用sed或awk对输出数据进行分组

此文件经常更新,它包含几千行,所以我想找到一个智能的解决方案脚本的输出。

我得到这个样子的:

NA 
10.0.0.0/16 
Dallas1 
NA 
10.1.0.0/16 
Houston1 
EMEA 
10.2.0.0/16 
Paris1 
EMEA 
10.3.0.0/16 
London1 
APAC 
10.4.0.0/16 
Hong-Kong1 
APAC 
10.5.0.0/16 
Shanghai1 

我需要两个不同的输出

第一个我解决了这一点:

awk 'NR%3{printf $0" ";next;}1' iplocationdata 

NA, 10.0.0.0/16, Dallas1 
NA, 10.1.0.0/16, Houston1 
EMEA, 10.2.0.0/16, Paris1 
EMEA, 10.3.0.0/16, London1 
APAC, 10.4.0.0/16, Hong-Kong1 
APAC, 10.5.0.0/16, Shanghai1 

第二列表,我想这样看:

NA 
10.0.0.0/16, Dallas1 
10.1.0.0/16, Houston1 
EMEA 
10.2.0.0/16, Paris1 
10.3.0.0/16, London1 
APAC 
10.4.0.0/16, Hong-Kong1 
10.5.0.0/16, Shanghai1 

这个我一直没能解决。如果可能的话,我更喜欢一个班轮,有人有这个好的解决方案吗?

+0

决不做'printf的$ 0',永远做'printf的 “%S”,$ 0'代替。想象一下当$ 0包含'printf'格式化字符时/区别。 –

回答

4

编辑:添加缺少,

$ awk '$1==p{next} NR%3==1{print; p=$1} NR%3==2{printf "%s, ",$0} NR%3==0' s.txt 

NA 
10.0.0.0/16, Dallas1 
10.1.0.0/16, Houston1 
EMEA 
10.2.0.0/16, Paris1 
10.3.0.0/16, London1 
APAC 
10.4.0.0/16, Hong-Kong1 
10.5.0.0/16, Shanghai1 
+0

谢谢,这正是我所需要的 – Stefan

0
awk 'NR%3 { 
    printf $0", " 
    next 
} 7' iplocationdata | tee outfile1 | awk 'BEGIN { 
    FS=OFS=", " 
} 
$1 != p { 
    p=$1 
    print $1 
} 
{ 
    print $2,$3 
}' > outfile2 

的第一部分(加在你的输出显示逗号你原来awk脚本

第二awk脚本。使用第一个脚本的输出作为输入,并在与先前保存的字段不同时保存第一个字段,为这些行打印$1并在前一日打印$2,$3 ry线。

0

一些神秘awk

$ awk 'NR%6!=4{ORS=(++c%5-3)^2==1?", ":RS; print}' file 

NA 
10.0.0.0/16, Dallas1 
10.1.0.0/16, Houston1 
EMEA 
10.2.0.0/16, Paris1 
10.3.0.0/16, London1 
APAC 
10.4.0.0/16, Hong-Kong1 
10.5.0.0/16, Shanghai1 

或许更可读的

$ awk '{c=NR%6} c!=4{ORS=c==2||c==5?", ":RS; print}' file