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>
.
grep
possible
로 시작하고 그 뒤에 최소한 하나의 숫자가 오는 행을 선택하십시오.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
또는 awk
POSIX 문자 클래스를 이해하지 못하는 경우
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!
중복 키로 어떤 행을 출력할지 말하지 않았으므로 두 번째 행이 위에 출력됩니다.