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()の使用
python
(itertools
)うまくいった。グループ化基準()。これはあなたの質問の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)])
グループ化された行の総数を合計します。