첫 번째 열의 값을 기준으로 모든 파일 내용을 그룹화하고 싶습니다. 출력이 정렬된 형식이면 더 좋을 것입니다.
입력하다:
1 foo
2 bar
1 foobar
2 barbar
3 apple
4 banana
3 mango
5 orange
예상 출력:
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
답변1
내가 올바르게 이해했다면 당신은 찾고 있습니다
perl -lane 'push @{$k{$F[0]}},$F[1];
END{$"=", ";print "$_ @{$k{$_}}" for sort keys(%k)}' file
명시적으로 라인을 분할할 이유가 없습니다. 플래그 -a
가 이를 수행합니다. 각 입력 행을 @F
배열로 분할합니다. 따라서 여기서는 %k
키가 첫 번째 필드이고 값이 두 번째 필드의 해당 목록인 해시를 만듭니다 . 그런 다음 마지막으로 해시 키를 정렬하고 $"
목록 구분 기호( )를 설정한 다음 ,[space]
각 키와 해당 값 목록을 인쇄합니다.
답변2
다른 perl
:
$ perl -anle '
push @{$h{$F[0]}}, $F[1];
END {
for (sort {$a <=> $b} keys %h) {
print "$_ ", join(", ", @{$h{$_}});
}
}
' file
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
설명하다
$h
키가 값인 해시를 만듭니다$F[0]
. 각 해시 값은 배열 참조입니다. 각 행이 처리될 때 두 번째 필드의 값을$F[1]
배열 참조에 추가합니다push @{$h{$F[0]}}, $F[1]
.$h
모든 행을 처리한 후 키( )를 정렬하고sort {$a <=> $b} keys %h
각 배열 참조를 문자열(join(", ", @{$h{$_}})
)에 연결하고 연결된 문자열에 해당하는 각 키를 인쇄합니다.