
메모장에 다음 데이터가 있습니다.
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