인수로 제공된 각 파일에 대해 가장 빈번한 행을 표시하는 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
- 참조 변수