각 행의 마지막 문자열을 기준으로 목록을 그룹화합니다.

각 행의 마지막 문자열을 기준으로 목록을 그룹화합니다.

다음과 같은 문자열 목록(정렬된 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

관련 정보