同様の質問をしましたが、人々は私の質問を誤解しました。単語数は、ファイルごとの単語ごとに一度だけ増加して、各単語のリストを生成する方法を尋ねます。
たとえば、10個のファイルを含むディレクトリがあり、bashコマンドを使用してファイルに表示される単語の数に応じて、1から10の値を持つ単語のリストを生成しようとします。
10 The
10 and
8 bash
7 command
6 help....
など。
私はすでに単一の単語を検索していることを知っていますが、grep -l word *| wc -l
すべての単語のリストを作成したいと思います。
tr '[A-Z]' '[a-z]' | tr -d '[:punct:]'
大文字で単語を繰り返すことなく句読点を削除することと組み合わせる方法はありますか?
答え1
ここではPerlを使います。
perl -T -lne '
for (/\w+/g) {$count{lc $_}->{$ARGV}=undef}
END {print "$_: " . keys %{$count{$_}} for keys %count}' ./*
$count{word}
これは、キーが見つかったファイルの名前であるハッシュへの参照であるハッシュを構成しますword
(そして私たちが気にしない値はここに設定されますundef
)。
最後に、各ハッシュ(つまり、見つかった各単語)の要素数(つまりファイル数)のみを計算します。
答え2
私はオリジナルを見ました。ここに答えてください投稿者:@Mehmet関連のないコンテンツを検索している間は動作しますが、非常に非効率的であり、すべてのファイルのすべての固有の単語を取得するために各ファイルを再度読み取る必要があることを発見しました! @ Jeffの2番目の答えは非常に複雑で、説明にもかかわらず最悪の部分は罪に苦しんでいるということですcat file |
!
すべてのデータに対して1つのパスしか必要とせず、以前の回答を効率的に組み合わせて定式化できます。
find . -maxdepth 1 -type f -print |
while read file; do
egrep -h -o "[[:alnum:]][[:alnum:]_-]*" "$file" |
tr '[A-Z]' '[a-z]' |
sed "s|^|$file\||"
done |
sort -t '|' -k 2 |
uniq |
awk -F '|' '{
if (lw != $2) {
print fc " " lw;
fc = 0;
}
lw = $2;
fc++;
}'
ファイル名にパスが含まれているかスペースが含まれている場合は、フィールド区切り文字の選択が重要です。この文字を選択した|
理由は、この文字が印刷された単語の一部であってはならず、egrep
ファイルまたはディレクトリ名に表示される可能性がほとんどないためです。
答え3
これを行うには、すべてのファイルからすべての単語を取得して並べ替え、一意の単語を取得し、単語を繰り返し、その単語が表示されるファイルの数を数える必要があります。
# find all words from all files within the directory
grep -o -h -E '\w+' directory/*|sort -u | \
while read word;
do
# iterate through each word and find how many files it occurs
c=`grep -l "$word" directory/*|wc -l`
echo "$c $word";
done
答え4
ディレクトリ内の各ファイルを個別に処理する方法は次のとおりです。
for f in yourdirectory/*; do cat "$f" |
以下は、テキストデータから単語を除くすべての項目をフィルタリングする方法です。
sed 's/\.$//;s/\.\([^0-9]\)/\1/g;s/[][(),;:?!]//g' | tr [A-Z] [a-z] |
しかし、あなたのアプローチも同様に効果的です。 (ハイフンでつながった単語からハイフンを削除したり、略語からアポストロフィを削除しないように注意したいです。)
どちらにしても下に進んでください。
tr -s ' ' '\012' | sort -u ; done |
これにより、ファイルごとの単語リストが生成されるので、今は次のようになります。
sort | uniq -c
最も頻繁なものから最も低いものの順にリストが必要な場合を追加するだけです|sort -nr
。
入力データによっては、上記{}
のリストのように句読点を追加する必要があります。sed