按每行的最后一个字符串对列表进行分组

按每行的最后一个字符串对列表进行分组

我有一个字符串列表(已排序的 IP 地址范围),如下所示:

10.100.0.0-10.100.255.255 External: 2.2.2.2
10.120.0.0-10.255.255.255 External: 2.2.2.2
10.0.0.0-10.255.255.255 External: 3.3.3.3
192.168.160.1-192.168.160.255 External: 3.3.3.3
and so on..

如何按每行的最后一个字符串对它们进行分组,以便结果看起来类似于:

External: 2.2.2.2
  10.100.0.0-10.100.255.255
  10.120.0.0-10.255.255.255

External: 3.3.3.3
  10.0.0.0-10.255.255.255
  192.168.160.1-192.168.160.255

注意:不需要处理 IP 地址。我们可以将它们视为字符串,因为它们已经排序和排序。我正在寻找一个纯 Bash 解决方案(不是 Python),最好没有 xargs。

提前致谢!

答案1

记住变量中的最后一个外部 ip。如果新的 ip 不同,则打印新的 ip。然后打印ip范围。

#! /bin/bash
last_ip=""
while read range _e ip ; do
    if [[ $ip != "$last_ip" ]] ; then
        printf '\nExternal: %s\n' "$ip"
    fi
    printf '  %s\n' "$range"
    last_ip=$ip
done < "$1"

答案2

awk '{

if($2$3 in STORE){

##make column 2 and column 3 as key to store address.
STORE[$2$3]=STORE[$2$3]"\n""\t"$1  ##add new line here 

}
else{
##if key not in STORE, add first column with a tab 
STORE[$2$3]="\t"$1 

}
}
##print everything using END 

END{
for(add in STORE){
print add"\n"STORE[add]
}
}' file.txt

相关内容