按数据中心对密钥和组进行文件分类

时间:2018-04-25 22:40:17

标签: linux bash sorting

我有一个像key=value这样的文件,我想按升序对其进行排序。我有两种类型的机器 - 一种在abc数据中心,另一种在pqr数据中心。

p10=machineA.abc.host.com
p7=machineB.abc.host.com
p3=machineC.abc.host.com
p8=machineD.abc.host.com
p10=machineE.pqr.host.com
p7=machineF.pqr.host.com
p3=machineG.pqr.host.com
p8=machineH.pqr.host.com

所以我应该通过数据中心打印出这样的组,并按键按升序排序。这有可能做到吗?

p3=machineC.abc.host.com
p7=machineB.abc.host.com
p8=machineD.abc.host.com
p10=machineA.abc.host.com

p3=machineG.pqr.host.com
p7=machineF.pqr.host.com
p8=machineH.pqr.host.com
p10=machineE.pqr.host.com

我试过sort -n machines.txt,但这不是我想要的方式。

2 个答案:

答案 0 :(得分:2)

你可以做到

[namedtuple for namedtuple in list if namedtuple.id != 'id']

这会将sed 's/.\(.*\)/\1/g' inputfile | sort -t. -k2 -k1,1n | sed 's/^/p/g' 设置为字段分隔符。然后它将在文本上对第二个字段(.)进行排序,然后在数字上对第一个字段(-k2)进行排序。

答案 1 :(得分:0)

awk + sort -t'.' -k2 -k1,1V file | awk 'BEGIN{ FS=OFS="." }dc && $2 != dc{ print "" }{ dc = $2 }1' 解决方案:

-t'.'
  • -k2 - 字段分隔符
  • -k1,1V - 在第1阶段按数据中心名称排序
  • awk -F'[=.]' '{ $0 = $1 OFS $(NF-2) OFS $0 }1' machines.txt \ | sort -k2,2 -k1,1V \ | awk 'BEGIN{ FS=OFS="." }{ sub(/^[^ ]+ [^ ]+ /, "") }dc && $2 != dc{ print "" }{ dc = $2 }1' - 自然的

更新

数据中心名称视为最后的第3个字段:

p3=machineC.abc.host.com
p7=machineB.abc.host.com
p8=machineD.abc.host.com
p10=machineA.abc.host.com

p3=machineG.pqr.host.com
p7=machineF.pqr.host.com
p8=machineH.pqr.host.com
p10=machineE.pqr.host.com

输出:

Form