引数として指定された各ファイルについて、最も頻繁な行を表示する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
- 参照変数