인수로 제공된 각 파일에 대해 가장 많이 발생하는 행을 표시하는 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
  • 참조 변수

관련 정보