오늘 면접관님이 이런 질문을 하셨습니다. 다음 내용을 포함하는 "Myfile.txt"라는 파일이 있다고 가정합니다. (반드시 한 줄에 있을 필요는 없음)
1 3 4
4 1 5
1 9 8
3 2 1
6 0 0
3 4 5
7 8 9
해당 파일에 어떤 숫자가 몇 번 나타나는지 알려주는 스크립트를 작성하고 싶습니다. 0부터 9까지의 숫자가 포함되어 있음을 알 수 있습니다. 보시다시피 이 파일에서 "1"은 4번 반복되며 출력에는 "이 파일에서 숫자 1이 4번 사용되었습니다"라는 메시지가 표시되어야 합니다.
답변1
파일이 한 줄에 여러 개의 숫자를 가질 수 있는 경우 먼저 한 줄에 하나씩 변경한 다음 계산하는 것이 더 간단합니다. 예를 들어:
$ tr ' ' '\n' < file| sort | uniq -c
2 0
4 1
1 2
3 3
3 4
2 5
1 6
1 7
2 8
2 9
자세한 출력이 정말로 필요한 경우 다음과 같이 추가로 구문 분석할 수 있습니다.
$ tr ' ' '\n' < file| sort | uniq -c | while read cnt num; do printf 'The number %s appears %s times in the file\n' "$num" "$cnt"; done
The number 0 appears 2 times in the file
The number 1 appears 4 times in the file
The number 2 appears 1 times in the file
The number 3 appears 3 times in the file
The number 4 appears 3 times in the file
The number 5 appears 2 times in the file
The number 6 appears 1 times in the file
The number 7 appears 1 times in the file
The number 8 appears 2 times in the file
The number 9 appears 2 times in the file
또는:
$ tr ' ' '\n' < file| sort | uniq -c | awk '{print "The number "$2" appears "$1" times in the file"}'
The number 0 appears 2 times in the file
The number 1 appears 4 times in the file
The number 2 appears 1 times in the file
The number 3 appears 3 times in the file
The number 4 appears 3 times in the file
The number 5 appears 2 times in the file
The number 6 appears 1 times in the file
The number 7 appears 1 times in the file
The number 8 appears 2 times in the file
The number 9 appears 2 times in the file
답변2
$ awk -v RS='[[:space:]]+' \
'{ n[$1]++ };
END {
for (i in n) {
print i":",n[i]
}
}' debasish.txt
(이것은 가독성을 위해 줄 바꿈과 들여쓰기가 추가된 한 줄씩 작성되었습니다.)
레코드 구분 기호( RS
)를 모든 종류의 공백(공백, 탭, 줄 바꿈 등) 1개 이상으로 설정한 다음 배열에 나타나는 각 숫자를 계산합니다 n
. n
입력이 끝나면 각 요소의 합계를 인쇄합니다 .
산출:
0: 2
1: 4
2: 1
3: 3
4: 3
5: 2
6: 1
7: 1
8: 2
9: 2