我有一个类似于以下内容的列表:
192.168.2.1 sometext.com
192.168.2.1
192.168.2.3
192.156.1.6
192.156.1.6 moretext.com
192.123.1.1
192.564.7.3
192.564.7.3 hello.com
我需要的输出:
192.168.2.1 sometext.com
192.168.2.3
192.156.1.6 moretext.com
192.123.1.1
192.564.7.3 hello.com
我想删除没有主机名的 IP除非他们已经有一行包含主机名。
参见上面的例子。
这可以吗?
答案1
这是awk
解决方案(我假设输出顺序无关紧要)。
awk '!seen[$1]{ seen[$1]=$0; next } $2!=""{ seen[$1]=$0 }
END{ for (x in seen) print seen[x] }' infile
这里我们定义一个名为seen
和的关联数组$1
作为其键索引;因此,我们检查第一列的键,即数组中不存在的 IP,!seen[$1]
然后将整行添加$0
到该键的值并读取next
行;否则(IP 之前已经见过并且存在于数组中)如果下一行具有相同的 IP 且具有主机名,则使用当前行值更新该键的值。
在最后,我们循环遍历用变量视为x
数组索引的数组,并打印这些键的值。