
나한테는 다음과 같은 거대한 목록이 있어요
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
더 검색하고 싶습니다. 2 이후에 중복된 번호가 있습니다. 그리고 3일 이전;
첫 번째 줄의 번호는 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
세 개의 필드 x
( foo bar
, 및 ) 로 구문 분석합니다 y
.
레코드 규칙(스니펫의 중간 부분)은 입력의 모든 레코드(라인)에 적용됩니다. 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