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