txt
다음과 같은 파일이 있습니다 .
Large 0
Large 0
Large 1
Large 2
Medium 0
Medium 1
Medium 1
small 1
small 3
다양한 대형, 중형, 소형 라인을 모두 결합하여 다음과 같은 결과를 출력하고 싶습니다.
Large 3
Medium 2
Small 4
또 다른 비슷한 문제가 있지만 다른 파일은 단지 단어일 뿐입니다. 예를 들면 다음과 같습니다.
MVCC Cybersecurity
MVCC Cybersecurity
MVCC Cybersecurity
도수 합계, 즉 사이버 보안의 총 횟수를 출력하고 싶습니다.
MVCC 3
답변1
perl -lane '@F == 2 and $h{$F[0]}+=$F[1]}{print "$_ $h{$_}" for keys %h' yourfile
행에 정확히 2개의 필드가 있는 경우 키의 두 번째 필드가 첫 번째 키인 해시를 업데이트하세요. 마지막으로 키와 해당 값을 인쇄하세요.
해시 %h의 데이터 구조는 다음과 같습니다.
%h = ( ... LARGE => running_sum, ... );
앗
awk '
NF == 2 { seen[$1] += $2 }
END{
for(i in seen)
print i, seen[i]
}
' yourfile
답변2
그누를 봐데이터 혼합:
$ datamash -W -g 1 sum 2 < ex.txt
Large 3
Medium 2
small 4
-W
공백으로 구분된 열(기본값은 탭)-g 1
열 1로 그룹화sum 2
합계 2열
두 번째 예는 그다지 명확하지 않습니다. 다음은 발생 횟수를 계산하는 것뿐입니다.
$ datamash -W -g 1 count 2 < ex2.txt
MVCC 3
답변3
Python의 groupby() 사용
python
( itertools
) 잘했어요그룹화 기준(). 다음은 귀하의 질문 두 가지(부분)에 대한 두 개의 작은 스크립트입니다.
코드를 빈 파일에 복사하고 텍스트 파일의 경로를 설정한 후 다음을 사용하여 실행하세요.
python3 /path/to/script.py
질문의 첫 번째 부분;
#!/usr/bin/env python3
from itertools import groupby
from operator import itemgetter
f = '/path/to/file'
for i, n in groupby([l.split() for l in open(f)], itemgetter(0)):
print(i, sum([int(n[1]) for n in list(n)]))
f
따옴표로 묶인 파일 경로는 어디에 있습니까?
산출:
Large 3
Medium 2
small 4
질문의 두 번째 부분은 첫 번째 열이 비슷한 행 수를 계산하는 것입니다.
첫 번째 항목의 간단한 편집은 다음과 같습니다.
#!/usr/bin/env python3
from itertools import groupby
from operator import itemgetter
f = '/path/to/file'
for i, n in groupby([l.split() for l in open(f)], itemgetter(0)):
print(i, len(list(n)))
여기서 f(다시)는 따옴표로 묶인 파일 경로입니다.
파일에서:
MVCC Cybersecurity
MVCC Cybersecurity
MVCC Cybersecurity
Monkey Cybersecurity
Monkey Cybersecurity
출력은 다음과 같습니다.
MVCC 3
Monkey 2
노트
귀하의 예에서는 행이 정렬됩니다. 따라서 먼저 행을 정렬할 필요는 없다고 생각합니다. 라인이 정렬되지 않은 경우 이를 표시하십시오.
설명하다
[l.split() for l in open(f)]
파일을 열고 f
해당 줄을 읽고 분할합니다.
groupby([l.split() for l in open(f)], itemgetter(0))
그후그룹첫 번째 항목의 행
sum([int(n[1]) for n in list(n)])
그룹화된 행의 총 숫자 수를 합산합니다.