다음과 같은 문자열 목록(정렬된 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 주소를 처리할 필요가 없습니다. 정렬되고 정렬되므로 문자열로 처리할 수 있습니다. 저는 xargs가 없는 순수한 Bash 솔루션(Python이 아닌)을 찾고 있습니다.
미리 감사드립니다!
답변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