파일에서 반복되는 부분 문자열 검색

파일에서 반복되는 부분 문자열 검색

possible주어진 입력 파일에서 패턴으로 시작하는 문자열이 반복적으로 나타나는 것을 검색하고 싶습니다 .

  • 입력 예:
    this is the best possible solution
    possible1234 solution!!!
    possible5678 solution!!!
    possible5678 solution!!!
    possible0000 solution!
    possible0000 solution!
    There should be some "possible7777" solution!
    There should be some "possible7777" solution!
    
  • 원하는 출력:
    possible5678 solution!!!
    possible0000 solution!
    There should be some "possible7777" solution!
    
    possibleNNNN이는 파일에서 여러 번 발생하는 패턴 일치이기 때문입니다.

답변1

이는 특정 문제에 대한 가능한 해결책을 제공합니다.질문에 대한 다양한 수정:

<your-file grep '^possible[[:digit:]]' | sort | uniq -d

로 시작하는 중복 줄을 어휘적으로 정렬한 목록을 제공합니다 possible<digit>.

  • greppossible로 시작하고 그 뒤에 최소한 하나의 숫자가 오는 행을 선택하십시오.
  • sort중복 항목이 인접하도록 결과를 정렬합니다(필수 uniq).
  • uniq -d중복으로 신고되었습니다.

GNU 구현 또는 호환성을 possible<digits>가정하여 입력의 모든 항목을 일치시키려면 다음을 수행하십시오 .grep

<your-file grep -Po 'possible\d+' | sort | uniq -d

다음과 같이 입력하면:

아마도 123나는 xx입니다아마도 123

그러면 다음이 제공됩니다.

possible123

중복 항목이 포함된 모든 고유 행의 경우 possible<digit>:

perl -lne 'if (/possible(\d+)/) {
             $count{$1}++;
             $lines{$1}->{$_}++;
           }
           END{
             for $k (grep {$count{$_} > 1} keys %count) {
               print for keys %{$lines{$k}}
             }
           }' < your-file

다음과 같이 입력하면:

this is the best possible solution
possible1234 solution!!!
possible5678 solution!!!
possible5678 solution!!!
possible0000 solution!
impossible0000 other solution!

그것은 다음을 제공합니다:

possible0000 solution!
impossible0000 other solution!
possible5678 solution!!!

( 주어진 행이 서로 옆에 있다는 것 외에는 possibleXXXX정의된 순서가 없습니다 ).

답변2

수정된 예의 경우 awk- 기반 솔루션이 작동합니다.

awk '/possible[[:digit:]]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

또는 awkPOSIX 문자 클래스를 이해하지 못하는 경우

awk '/possible[0-9]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

possible각 줄에 패턴과 최소한 하나의 숫자가 포함되어 있는지 확인합니다. 발견되면 발생 카운터가 증가합니다.전체 라인에 대해. 마지막으로 발생 카운터가 1보다 큰 행만 인쇄합니다.

이는 실제 입력이 표시된 경우에만 작동합니다. 서로 다른 라인이 동일한 패턴을 가질 수 있다면 possibleNNNN, 그것은 실패입니다!

답변3

다음 방법을 사용하여 중복 행의 순서를 유지할 수 있습니다.

환경 변수 "re"에 정규식을 저장하고 match 명령을 사용하여 정규식 라인을 찾습니다. 해당 줄에서는 gsub 명령을 사용하여 이 시점에서 보고 있는 정규식의 개수를 업데이트했습니다.

$ re='\<possible[0-9]+\>' \
awk  'BEGIN { r = ENVIRON["re"] }
match($0, r) && 
(a[substr($0,RSTART,RLENGTH)] += gsub(r, "&")) == 2'  logfile

Perl의 한 줄의 코드는 다음과 같습니다:

perl -lne 'print if /\bpossible(\d+)\b/ && 2 == ($h{$1} +=()= //g)' logfile

답변4

\<GNU awk를 사용하여 단어 경계, \w약어 및 match()의 세 번째 인수를 나타냅니다 .

$ awk 'match($0,/\<possible\w*/,a) && ++cnt[a[0]]==2' file
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!

중복 키로 어떤 행을 출력할지 말하지 않았으므로 두 번째 행이 위에 출력됩니다.

관련 정보