引数として指定された各ファイルについて、最も発生する行を表示するbashスクリプトを作成します。

引数として指定された各ファイルについて、最も発生する行を表示するbashスクリプトを作成します。

引数として指定された各ファイルについて、最も頻繁な行を表示するbashスクリプトを作成します。発生順に降順で表示されます。

行をどのように書くか、配列に表示される回数がわかりません(後でソートします)

編集する:

以前に行った操作を変更しましたが、現在発生した行数と各ファイルが発生した回数を見つけることができます。しかし、どのようにソートするのかわかりません。

編集:もう少し変更しました。今、このコードは私が望むことを行いますが、より良い方法はありますか?

    #!/bin/bash
if [ $# -eq 0 ]
then
        echo "Input at least one argument"
        exit 1
fi

declare -a my_array



K=0
for FILE in $*
do
        line=$(sort $FILE | uniq -c | sort -rn | head -n 1 | sed -E 's/^ *[0-9]+ //g')
        max=$(sort $FILE | uniq -c | sort -rn | head -n 1 | awk '{print $1}')
        echo $max
        echo $line
        my_array[$K]=$line
        my_array1[$K]=$max
        K=$(($K+1))
done


result=$(( COUNTER=0
         while [  $COUNTER -lt "${#my_array[@]}" ]; do
            echo ${my_array1[$COUNTER]} ${my_array[$COUNTER]}
             let COUNTER=COUNTER+1
         done ) | sort -r)
echo "$result"

入力例

ファイル1:

one two three
four five
one two three

ファイル2:

nine nine 
eight seven
nine
eight seven
eight seven

それから:

$ ./exercise.sh file1 file2
3 eight seven 
2 one two three

答え1

ほぼすべて来ました。ループの出力をソートし、行の先頭のスペースを削除できます。

#!/bin/bash

if [ $# -eq 0 ]; then
    echo "Input at least one argument" >&2
    exit 1
fi

for file; do
    sort "$file" | uniq -c | sort -rn | head -n1
done | sort -rn | sed 's/^ *//'

その他の変更点:

  • stderrにエラーメッセージを出力する
  • 位置引数を繰り返すには、それfor file; do以上のバージョンを使用してください。for file in "$@"; do
  • 参照変数

関連情報