sed 또는 awk를 사용하여 입력 파일에서 새 패턴이 필요합니다.

sed 또는 awk를 사용하여 입력 파일에서 새 패턴이 필요합니다.

다음과 같은 데이터가 있습니다.

MGW: VMG110
836-16
836-18
836-19
336-20
836-23
MGW: VMG120
3802-1
3802-2
3802-3
3456-1
3456-4

원하는 출력은 다음과 같습니다.

VMG110:836-16&-18&&-20&-23
VMG120:3802-1&&-3&3456-1&-4

주어진 데이터 -1,-2,-3,-4는 항상 정렬됩니다.

출력에 -19가 없습니다...-18&& 대신 -20이 있습니다. 여기서 &&는 18~20을 의미합니다. 동일하게 제공하십시오.

답변1

펄 솔루션. 출력의 첫 번째 줄이 귀하의 것과 다릅니다(원하는 출력에 다음이 누락되었습니까 -?).&

#!/usr/bin/perl
use warnings;
use strict;

my $first = 1;
my @line;

sub output {
    print join('&', @line), "\n" unless $first;
}


my $previous = q();
while (<>) {
    chomp;
    if (s/.*: //) {
        output();
        print "$_:";
        $previous = q();
        @line = ();

    } else {
        my ($prefix, $suffix) = split /-/;
        if ($prefix ne $previous) {
            push @line, "$prefix-$suffix";
        } else {
            push @line, "-$suffix";
        }
        $previous = $prefix;
    }
    undef $first;
}
output(); # Don't forget to output the last line.

답변2

awk -F '-|: ' '
    function printit(  sep,key) {
        sep = ""
        for (key in data) {
            printf "%s%s", sep, data[key]
            sep = "&"
        }
        print ""
        delete data
    }
    $1 == "MGW" {
        if (key1) printit()
        key1 = $2
        printf "%s:", key1
        next
    }
    !data[key1,$1] {
        data[key1,$1] = $0
        next
    }
    {data[key1,$1] = data[key1,$1] "&-" $2}
    END {printit()}
' file
VMG110:836-19&-23
VMG120:3802-1&-2&-3&3456-1&-2
VMG119:3248-1&-2&3802-8&-9&-10&-11&-12&-13&3457-18&-19&-20

관련 정보