특정 숫자보다 큰 경우 중복 파일 정렬

특정 숫자보다 큰 경우 중복 파일 정렬

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

끝에는 awk10보다 크거나 같은 개수에 해당하는 줄만 인쇄합니다 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개 결과를 제공합니다 .sorthead

계산은 c현재 입력 줄이 키로 사용되는 연관 배열의 요소를 증가시켜 수행됩니다.

블록 END( 에서 마지막 줄을 읽은 후 트리거됨 file.log)은 의 모든 키를 반복 c하고 키가 10보다 크거나 같은 개수에 해당하는 경우 해당 개수가 있는 줄과 함께 개수가 인쇄됩니다.

답변3

sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'

관련 정보