앗

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)])

그룹화된 행의 총 숫자 수를 합산합니다.

관련 정보