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}}}'