Bash

編寫一個 bash 腳本,對於作為參數給出的每個文件,顯示出現次數最多的行

  • July 1, 2021

編寫一個 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來循環位置參數
  • 引用變數

引用自:https://unix.stackexchange.com/questions/656629