연속된 줄의 일부 반복되는 부분을 축소합니다.

연속된 줄의 일부 반복되는 부분을 축소합니다.

메모장에 다음과 같은 데이터가 있습니다.

4480-1
4480-2
4480-3
4480-15
4581-1
4581-2
4581-3
4581-4

for 루프 같은 것을 사용해서 할 수 있나요? sed로?

내 필수 출력은4480-1&-2&-3&-15&4581-1&-2&-3&-4

답변1

이것은 작동합니다:

awk -F- '$1!=a{printf "%s", $1} {printf "-%s&", $2} {a=$1}' file | sed 's/&$/\n/g'

아웃아웃:

4480-1&-2&-3&-15&4581-1&-2&-3&-4

설명:

  • awk -F-구분 기호는-
  • $1!=a{printf "%s", $1}4480마지막으로 처리된 줄과 동일하지 않은 경우 첫 번째 부분을 인쇄합니다.
  • {printf "-%s&", $2}&끝에 두 번째 부분을 인쇄하십시오.
  • {a=$1}a를 처리된 라인에 설정
  • sed 's/&$/\n/g'a인 마지막 문자를 제거 &하고 개행 문자를 추가합니다.

답변2

나는 당신이 그것을 sed쉽게 할 수 있다고 생각하지 않습니다. 다음을 사용하면 더 쉽습니다 perl.

$ perl -F'-' -anle '
    $h{$F[0]} .= defined($h{$F[0]}) ? "&-".$F[1] : "-".$F[1];
    END {
        $,="&";
        print @{[map { $_.$h{$_} } sort { $a <=> $b } keys %h]}
    }
' file
4480-1&-2&-3&-15&4581-1&-2&-3&-4

답변3

아마도 sed에서는 불가능할 것입니다. 저는 AWK로 하고 있어요. 한 줄에 하나의 항목이 있다고 가정합니다.

awk '
  BEGIN { FS="-"; ORS=""; left="" }

  {
    if(NR>1){print "&"}

    # Only print left part if it differs from previous line
    if ($1!=left) {
      print $1 "-" $2
      left=$1;
    } else {
      print "-" $2
    }
  }' inputfile.txt

출력4480-1&-2&-3&-15&4581-1&-2&-3&-4

답변4

sed가 필요하지만 Perl은 다음과 같습니다.

#!/usr/bin/perl

while ( ($a,$b) = split /-/,<>) { $n->{$a}->{"-$b"}++;}

@_ = map { $_,
           map { chomp; "$_&"; } reverse sort { $a <=> $b } keys $n->{$_};
     } sort { $a <=> $b } keys $n;

@_[-1] =~ s/&$//;

print @_;

입력 순서에 의존하지 않고 숫자로 정렬된 출력:

4480-1&-2&-3&-15&4581-1&-2&-3&-4

관련 정보