file.log
여러 번 나타날 수도 있고 나타나지 않을 수도 있는 데이터가 포함된 파일이 있습니다 .
a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e
현재 sort file.log | uniq -c | sort -rn | head -n 10
발견된 중복 항목 수를 기준으로 파일을 정렬하고 있는데, 가장 자주 발견되는 항목 10개를 얻었습니다. 예를 들어 파일에 문자가 5번 나타나면 5
해당 문자가 표시됩니다.
파일에서 특정 횟수 이상 나타나거나 반복되는 문자를 가져오기 위해 행을 출력하는 방법은 무엇입니까? 예를 들어 10번 이상 나타나는 문자만 가져옵니다. 그리고 10개 이상의 중복이 있는 문자에 대해 5개의 결과만 출력하는 등 출력할 문자 수를 정의하는 방법이 더 좋습니다.
답변1
주어진 입력을 사용하여 세 번 이상 나타나는 문자를 찾으려면 개수를 유지하고 세 번째 발생 시 줄을 출력합니다.
$ awk '++count[$0] == 3' file
a
b
파이프를 통한 출력을 제한합니다 head
. 이것은 분명히 발생별로 정렬되지 않습니다. 이렇게 하려면 GNU awk를 사용하세요.
gawk -v limit=3 '
{ ++count[$0] }
END {
PROCINFO["sorted_in"] = "@val_num_desc"
n = 0
for (line in count) {
if (n == limit) break
print count[line], line
++n
}
}
' file
산출
6 a
3 b
2 d
참조번호https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
답변2
원래 파이프라인의 시작 부분을 사용한 후 awk
다음 결과를 필터링할 수 있습니다.
sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5
마지막은 awk
10보다 크거나 같은 개수에 해당하는 줄만 인쇄합니다 head
.매우end는 전체 결과를 최대 5개 행으로 제한합니다.
하지만 조금 더 할 수 있습니다 awk
.
awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5
먼저 계산을 수행하고 낮은 개수의 행을 지운 다음 및 를 사용하여 awk
처음 5개 결과를 제공합니다.sort
head
c
계산은 현재 입력 행을 키로 사용하여 연관 배열의 요소를 증가시켜 수행됩니다 .
이 END
블록(읽은 마지막 행 이후에 실행됨 file.log
)은 블록의 모든 키에 대해 반복되며 c
해당 키에 해당하는 개수가 10보다 크거나 같으면 해당 개수가 있는 행과 함께 개수가 인쇄됩니다.
답변3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'