複数のファイルの行頻度を計算する方法は?

複数のファイルの行頻度を計算する方法は?

私は多くの(すなわち>> 2)テキストファイルを持っています。ファイルはほとんど似ていますが、いくつかの違いがあります。このファイルで最も頻繁に発生する行を見つけたいと思います。たとえば、以下は私が探している情報の種類です(私はデータにのみ興味があり、特定の形式は必要ありません)。

$ cat file1
line1line1line1
line2line2line2
line3line3line3
$ cat file2
line1line1line1
line2line2line2
$ cat file3
line1line1line1
line3line3line3
$ cat file4
line4line4line4
$ my_awesome_script file{1,2,3,4}
count | line
------+----------------
    3 | line1line1line1
    2 | line2line2line2
    2 | line3line3line3
    1 | line4line4line4

同様のタスクを実行できる一般的なツールはいくつかありますが、いくつかの制限があります。

  • comm- 一度に2つのファイルのみを比較できます。両方のファイルに表示されない行は削除されます。
  • grep -f- 一致しないラインを破棄
  • grep -c- 一致する数を計算しますが、ファイルごとの総数を出力し、一致する入力パターンに関する情報を削除します。

明確にするために、1行がファイルに複数回表示される場合は、単一の一致としてのみ計算します。私はこの行が合計で数回表示されるのではなく、どのくらいのファイルに表示されるのかに興味があります。

ベストアンサー1

次のタスクが必要なタスクを実行する必要があります。

#! /bin/sh
for f in ./file*; do
    sort -u "$f"
done | \
    sort | \
    uniq -c | \
    sort -rn | \
    head -40

目的forは、各ファイルの各行が一度だけ計算されるようにすることです。残りのパイプラインの焦点は、発生回数を計算することです。

おすすめ記事