アッ

アッ

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つのフィールドがある場合は、キーの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列

2番目の例はあまり明確ではありません。以下は、発生回数を計算するだけです。

$ datamash -W -g 1 count 2 < ex2.txt
MVCC 3

答え3

Pythonのgroupby()の使用

pythonitertools)うまくいった。グループ化基準()。これはあなたの質問の2つ(部分)の2つの小さなスクリプトです。

コードを空のファイルにコピーしてテキストファイルのパスを設定したら、次のように実行します。

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

質問の2番目の部分は、最初の列が似ている行数を数えることです。

最初の項目の簡単な編集は次のとおりです。

#!/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)])

グループ化された行の総数を合計します。

関連情報