如何将相同的键值内联到一行中

时间:2017-05-25 09:32:52

标签: python-2.7 awk sed

如何将相同的键值内联到一行中,我在文件(file1.txt)中有以下条目,其中第一列具有键(服务器名称),而Forth列具有IP' s密钥属于,因此我正在寻找将所有IP内联到相同密钥名称的一行的方式。

keanx61.ddl.COM            out:  nameserver  192.22.48.33
keanx61.ddl.COM            out:  nameserver  192.22.48.23
keanx61.ddl.COM            out:  nameserver  172.144.71.11
  

我刚刚尝试awk如下,但它将整个输出包装成一个。

$ cat file1.txt | column -t  | tr -d '[]'| tr -d 'out:'  | tr -d 'nameserver' | awk 'NR%3{printf "%s ",$0;next;}1'


keanx61.ddl.COM       192.22.48.33 keanx61.ddl.COM  192.22.48.23 keanx61.ddl.COM   172.144.71.11

任何通过awk,python或其他方式获得它的方式都会有所帮助。我使用awk表示发生次数3,但它可能会更少或更多地寻找这些想法。

2 个答案:

答案 0 :(得分:0)

使用Awk逻辑

awk '{key[$1]=(key[$1] FS $NF); next}END{for (i in key) print i,key[i]}' file

将产生

输出
keanx61.ddl.COM  192.22.48.33 192.22.48.23 172.144.71.11

我们的想法是使用$1中的键值和最后一列$NF中的IP值创建哈希映射。解析完所有行后,我们在END{}子句中打印键值对。此处的值是给定密钥可用的IP列表。

该解决方案可以针对任何不同数量的密钥及其相应的IP进行扩展。

答案 1 :(得分:0)

awk 解决方案:

awk '{a[$1][NR]=$4}END{for(i in a){ r=i; for(nr in a[i]){r=r" "a[i][nr]} print r}}' file.txt

输出:

keanx61.ddl.COM 192.22.48.33 192.22.48.23 172.144.71.11

详细

  • a[$1][NR]=$4 - 多维数组,为每个主机名累积所有 IP

  • r=r" "a[i][nr] - 为每个主机名连接 IP 地址

Python 解决方案:

import re, collections
with open('file.txt', 'r') as f:      # reading the file
    d = collections.defaultdict(str)  # `string` is a prototype for the `d` (dict) values
    for l in f.read().splitlines():   # splitting the lines
        parts = re.split(r'\s+', l)   # split the line by whitespace characters (sequence)
        d[parts[0]] += " " + parts[3] # collecting IPs for each hostname

print '\n'.join(k+" "+v for k,v in d.items()) 

https://docs.python.org/2/library/collections.html#collections.defaultdict