如何将相同的键值内联到一行中,我在文件(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,但它可能会更少或更多地寻找这些想法。
答案 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