![파일에서 각 고유 줄의 발생 횟수를 계산하고 합산합니다.](https://linux55.com/image/64216/%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EA%B0%81%20%EA%B3%A0%EC%9C%A0%20%EC%A4%84%EC%9D%98%20%EB%B0%9C%EC%83%9D%20%ED%9A%9F%EC%88%98%EB%A5%BC%20%EA%B3%84%EC%82%B0%ED%95%98%EA%B3%A0%20%ED%95%A9%EC%82%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
uniq
이 질문에 대한 대답은 파일에서 각 줄이 나타나는 횟수를 계산할 수 있는 이 함수의 변형일 수 있다고 생각합니다 .
sort file.txt | uniq -c
나에게 문제는 이 uniq
함수를 사용하여 줄 수를 생성하고 출력을 다른 파일과 병합하기 때문에 파일에 추가 합리화가 필요한 중복 줄이 생긴다는 것입니다.
예를 들어 원래 uniq
줄 번호는 각 줄의 시작 부분에 있습니다.
34 banana
23 apple
48 grapefruit
23 banana
12 apple
그래서 내가 해야 할 일은 다음과 같습니다.
57 banana
35 apple
48 grapefruit
SUM
나머지 필드가 동일한 모든 경우에 첫 번째 필드에서 작동하는 일부 기능이 있습니까?
답변1
해결책 awk
:
$ awk '{i[$2]+=$1} END{for(x in i){print i[x]" "x}}' file.txt
35 apple
48 grapefruit
57 banana
먼저 awk
이름(바나나, 사과, 자몽)으로 인덱스된 배열을 만들고 첫 번째 열의 값을 합산합니다. 마지막으로 배열을 인쇄합니다.
답변2
저는 펄을 사용하겠습니다.
#!/usr/bin/perl
use strict;
use warnings;
my %count_of;
while ( <> ) {
my ( $word) = m/(\w+)/;
$count_of{$word}++;
}
foreach my $word ( sort { $count_of{$a} <=> $count_of{$b} } keys %count_of ) {
print "$count_of{$word} $word\n";
}
그것을 실행하십시오 perl script.pl file1 file2 file3 file4
.
아니면 그냥 cat을 사용하고 싶을 수도 있습니다.
cat file1 file2 file3 | sort | uniq -c