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