按列对列表进行排序

按列对列表进行排序

我有一个类似于以下内容的列表:

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数组索引的数组,并打印这些键的值。

相关内容