使用sed或awk对输出数据进行分组

时间:2016-01-29 17:04:00

标签: bash awk sed

我正在尝试将flatfile数据库filename=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

我需要两个不同的输出

第一个我解决了这个问题:

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

一些神秘的 If dowVal = 2 ^ (x - 1) Then mycheckbox.Checked = True End If

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