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
你快到了。您可以對循環的輸出進行排序(並刪除行首的空格):
#!/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
來循環位置參數- 引用變數