与订单无关的替代

时间:2016-05-06 08:10:36

标签: regex awk sed substitution

我有一个包含以下条目的文件:

server: 11.11.11.11
port: 1111

port: 2222
server: 22.22.22.22

每个条目用空行分隔。有时,portserver的顺序会被反转(如示例中所示)。

我想重新组织此文件以获取:

11.11.11.11:1111
22.22.22.22:2222

是否可以对文件进行排序?我可以将此结构与sed或awk匹配吗?

1 个答案:

答案 0 :(得分:4)

您可以使用awk:

awk -F ': *' 'function prnt() {
   print a["server"] ":" a["port"]
}
NF==2 {
    a[$1]=$2
    next
}
{
   prnt()
   delete a
}
END {
   prnt()
}' file

<强>解释

通过使用FS=': *',我们将每行分成2个字段。当NF==2我们使用密钥a(服务器或端口)和$1作为值填充数组$2时。 next将转到下一条记录。

NF==2为false时,我们调用prnt函数只打印数组a中的数据。 split会清空a中之前保留的值。最后,我们在prnt块中调用END来打印最后一条数据记录。

<强>输出:

11.11.11.11:1111
22.22.22.22:2222