
11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1
표시된 것과 같은 파일이 있지만 더 큰 규모입니다. 내 목표는 111s, 1s, 11s, 1111s 등의 양을 출력하는 것입니다. 파일에 있습니다. 나는 다음과 같은 일에 대해 이야기하는 많은 게시물을 보았습니다.
grep "\^word\" text_file
grep "\bword\b" text_file
grep -Fx "word" text_file
and so on...
이들 모두는 아무것도 출력하지 않거나 전체 파일을 출력했습니다. 특정 숫자만 나열하려면 어떻게 해야 하나요?
답변1
tr
, sort
및 사용 uniq
:
$ tr -s ' ' '\n' <file | sort | uniq -c
1
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
이렇게 하면 하나의 빈 줄(위 출력의 첫 번째 줄)에 대한 개수도 제공되지만 다음을 사용하면 이를 피할 수 있습니다 sed
.
$ tr -s ' ' '\n' <file | sed '/^$/d' | sort | uniq -c
17 1
5 11
1 111
2 11111
1 1111111
1 11111111
파이프라인은 모든 공백을 줄 바꿈으로 변경하고 결과 줄을 정렬하며 각 줄의 발생 횟수를 계산합니다.
답변2
나는 이것에 대해 grep을 사용하지 않고 awk를 사용하고 싶습니다.
$ a="11111 1 11 1111111 1 1 1 1 1 1 1 111 1 1 1 1 11 11111111 1 11 1 11 11 1 11111 1 1"
$ awk '{for (i=1;i<=NF;i++) ++seen[$i]}END{for (k in seen) print k,"found:"seen[k]}' <<<"$a"
1 found:17
11 found:5
111 found:1
11111 found:2
1111111 found:1
11111111 found:1
이 한 줄 데모는 전체 파일에서 작동합니다( <<<"$a"
로 대체 yourfile
).