더 많은 중복 항목 찾기

더 많은 중복 항목 찾기

나는 다음과 같은 거대한 목록을 가지고 있습니다

67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15

3 이전에 2 이후에 더 많은 중복 숫자를 검색하고 싶습니다.

첫 번째 행의 숫자는 이고 5450-7938-7992-5530, 다른 행의 숫자 4532-4142-5613-9690는 다음과 같습니다.

답변1

다음 awk 스크립트를 고려하십시오 duplicates.awk.

#!/usr/bin/awk -f
BEGIN {
    RS = "(\r\n|\n\r|\r|\n)"
    FS = "[\t\v\f ]*;[\t\v\f ]*"
    split("", count)
}

{
    count[$3]++
}

END {
    for (item in count) {
        if (count[item] > 1)
            printf "%s\n", item
    }
}

chmod a+rx duplicates.awk예를 들어 다음을 사용하여 실행 가능하게 만드는 것을 잊지 마십시오 . 입력을 명령으로 파이프하거나 하나 이상의 입력 파일을 명령줄 인수로 제공할 수 있습니다(여러 파일은 단일 파일로 연결된 것으로 간주됩니다).

BEGIN 규칙은 범용 줄 바꿈을 설정하고(즉, MS-DOS에서 이전 Mac, Unix에 이르기까지 모든 줄 바꿈 규칙을 허용함) 세미콜론을 ;필드 구분 기호로 사용합니다. 설명을 위해 필드 구분 기호가 주변의 모든 공백을 사용하여 세 개의 필드 ( , 및 ) x;foo bar ; y로 구문 분석하도록 만들었습니다 .xfoo bary

레코드 규칙(코드 조각의 중간 부분)은 입력의 모든 레코드(행)에 적용됩니다. awk는 연관 배열을 지원하므로 세 번째 필드(문자열)를 count배열의 키로 사용하고 해당 항목을 1씩 증가시킵니다. (awk에서 존재하지 않는 배열 항목을 증가시키면 1이 나오므로 첫 번째 증가는 1이 되고 코드는 예상대로 작동합니다.)

END 규칙은 count배열을 스캔하고 적어도 두 번 발생하는 항목을 인쇄합니다. 이 출력은 무작위 순서입니다. (발생 횟수에 따라 출력을 정렬하거나 파일의 원래 순서(처음 발생)를 보존하는 방법이 있지만 OP에서는 정렬 요구 사항에 대해 언급하지 않았으므로 귀찮게 하지 않았습니다. 정의되지 않음 주문이 가장 많습니다)

예를 들어 문자열 발생 횟수(세 번째 열의 값)를 인쇄하려면 다음 END 규칙을 대신 사용하세요.

END {
    for (item in count)
        printf "%15d %s\n", count[item], item
}

출력의 처음 15자는 숫자에 대해 유지되고 값은 문자 17에서 시작되도록 형식이 지정됩니다.

답변2

stack.txt 파일에 반복되는 값을 생성하고 출력을 인쇄하십시오 -

67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15

다음 명령을 사용하십시오 -

 awk 'BEGIN{FS=";"}{a[$3]++} END {for(k in a) print  a[k],k}' stack.txt

출력 -

3 4532-4142-5613-9690
2 5292-4905-4356-2840
3 5450-7938-7992-5530
2 4556-9998-5999-3300

관련 정보