私は多くの(すなわち>> 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
は、各ファイルの各行が一度だけ計算されるようにすることです。残りのパイプラインの焦点は、発生回数を計算することです。