行内でどの単語が重複しているか、またそれがファイル内で何回出現するかを知りたい

行内でどの単語が重複しているか、またそれがファイル内で何回出現するかを知りたい

a.txt例:次の内容を含むファイルがあります:

aunt bear bear true

b.txt以下の内容を含むファイルもあります。

tru tru high

私が望む最終結果は次のとおりです:

for a.txt : bear x 2
for b.txt : tru x 2

今のところ、私が考えられるのはこれだけです:

cut -d ' ' -f1 file.txt | sort | uniq -c | head -1

アイデアが全く出てこない

ファイルの並べ替えが必要です。明確化: c.txt、b.txt、y.txt というファイルを導入する場合、b のコンテンツが最初になり、y のコンテンツが最後になります。

答え1

任意のファイル名とファイル内容に機能するシンプルで高速なアプローチを次に示します。

$ for file in a.txt b.txt ; do 
    printf 'for %s : %s\n' "$file" "$(tr ' ' '\n' < "$file" | sort | uniq -dc)"; 
  done
for a.txt :       2 bear
for b.txt :       2 tru

または、本当に必要な場合はその通り表示する形式:

$ for file in a.txt b.txt ; do 
    printf 'for %s : %s x %s\n' "$file" \
        $(tr ' ' '\n' < "$file" | sort | uniq -dc | awk '{print $2,$1}');
  done
for a.txt : bear x 2
for b.txt : tru x 2

答え2

$ for i in $(cat a.txt); do echo $i; done | sort | uniq -c | sort -g | tail -1
      2 bear

脚本:

$ cat topword.sh
#!/bin/bash

FILENAMES=$@

for file in $@; do
    printf "$file:"
    cat $file | tr ' ' '\n' | sort | uniq -c | sort -g | tail -1
done

出力:

$ bash topword.sh a.txt b.txt
a.txt:      2 bear
b.txt:      2 tru

さて、ここで皆さんに課せられた課題は、私が渡したこの下書きから、見栄えがよく読みやすいスクリプトを作成することです。

答え3

簡単なawkコマンドで魔法が実現します

最初のステップは、特定の単語がファイル内で何回出現するかを計算する必要があることです。

ステップ1: 入力ファイルに基づいて新しい入力ファイルを作成する

cat input file |sed -r "s/\s+/\n/g" >inputfile_final.txt

ステップ2: これで、連想配列を使用したシンプルなawkコマンドが魔法のように機能します

awk '{a[$1]++}END{for(x in a){print FILENAME, x,a[x]}}' inputfile_final.txt | sort -k3 -nr| sed -n '1p'| awk '{print "for" " " $1 " " ":" $2 " " "x" " "  $NF}'

出力

for inputfile_final.txt :bear x 2


Note: I have done for 1 file same method we can follow for remaining files too

関連情報