编写一个 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来循环位置参数
  • 引用变量

相关内容