중복된 항목을 제거하고 쉼표로 바꿉니다.

중복된 항목을 제거하고 쉼표로 바꿉니다.

다음 순서로 IP 주소와 포트 번호가 포함된 파일이 있습니다.

IP 주소:포트

1.1.1.1:21
1.1.1.1:22
2.2.2.2:443
3.3.3.3:80
3.3.3.3:443



포트, 포트 형식의 결과 ipaddress가 필요합니다 .

1.1.1.1:21,22
2.2.2.2:443
3.3.3.3:80,443

답변1

입력 파일의 줄에 후행 공백이 없다고 가정합니다.

$ awk -F ':' 'BEGIN { OFS=FS } $1 in ports { ports[$1] = ports[$1] "," $2; next } { ports[$1] = $2 } END { for (ip in ports) print ip, ports[ip] }' file
3.3.3.3:80,443
1.1.1.1:21,22
2.2.2.2:443

스크립트 awk,

BEGIN       { OFS=FS }
$1 in ports { ports[$1] = ports[$1] "," $2; next }
            { ports[$1] = $2 }
END         { for (ip in ports) print ip, ports[ip] }

먼저 출력 필드 구분 기호를 입력 필드 구분 기호와 동일하게 설정합니다. 이는 문자 :( 명령줄에 제공됨 -F ':')입니다. 그런 다음 현재 첫 번째 필드(IP 주소)가 키 배열인지 테스트합니다 ports. 그렇다면 포트 번호(두 번째 필드)를 배열 항목에 쉼표 구분 기호로 추가합니다. 그렇지 않은 경우 배열의 항목은 해당 IP 주소의 포트 번호로 설정됩니다.

마지막으로 저장된 모든 IP 주소가 수집된 포트 번호와 함께 인쇄됩니다.

답변2

그리고GNU 데이터 통합

datamash -t: -s groupby 1 collapse 2 < file

데이터가 이미 정렬되어 있는 경우 생략할 수 있습니다 -s.


또는 Perl의 해시에 익명 배열을 사용합니다.

$ perl -F: -lne '
    push @{ $h{$F[0]} }, $F[1] 
    }{ 
    for $k (sort keys %h) {print "$k:", join ",", @{ $h{$k}} }
' file
1.1.1.1:21,22
2.2.2.2:443
3.3.3.3:80,443

답변3

밀러 사용(http://johnkerl.org/miller/doc) 예

mlr --nidx --fs ':' nest --implode --values --across-records --nested-fs "," -f 2 input

그것은 당신에게 피드백을 제공합니다

1.1.1.1:21,22
2.2.2.2:443
3.3.3.3:80,443

답변4

sed 편집기를 사용하여 이 작업을 수행 할 수 있습니다 . 패턴 공간에서 언제든지 2줄을 유지하고 IP 번호의 변화를 찾습니다. 동일한 IP를 계속 얻는 한, 두 번째 부분에서 해당 IP를 제거하고 쉼표를 사용하여 첫 번째 부분과 연결합니다. 그렇지 않은 경우 IP 변경이 감지되었음을 의미합니다. 즉시 첫 번째 부분만 인쇄하고 패턴 공간에서 제거한 다음 돌아가서 다음 IP 라인을 패턴 공간으로 읽어 동일한 검사를 반복합니다.

$ sed -e '
    :loop
       $!N
       s/^\(\([^:]*:\).*[^[:space:]]\).*\n\2/\1,/
    tloop
    P;D
 ' input-file.txt

 1.1.1.1:21,22
 2.2.2.2:443 
 3.3.3.3:80,443

 $ perl -lne '
    my($ip, $port) = /(\H+):(\H+)/;
    push @seen, $ip if ! exists $h{$ip};
    push @{$h{$ip}}, $port;}{
    print $_,  ":", join ",", @{$h{$_}} for @seen;
 ' input-file.txt

Perl을 사용하면 IP를 키로 유지하고 배열 참조를 포트를 포함하는 값으로 유지하는 해시로 동일한 작업을 수행할 수 있습니다. 또한 후행 공백이 고려되지 않도록 합니다. @seen 배열은 IP를 나타나는 순서대로 유지합니다.

관련 정보