![sed 또는 awk를 사용하여 입력 파일에서 새 패턴이 필요합니다.](https://linux55.com/image/39097/sed%20%EB%98%90%EB%8A%94%20awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%9E%85%EB%A0%A5%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%83%88%20%ED%8C%A8%ED%84%B4%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다음과 같은 데이터가 있습니다.
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