어떤 단어라도 포함된 줄을 세 번 찾고 싶습니다. 이를 위해서는 이 명령을 사용하는 것이 더 낫다고 생각합니다 grep
.
이것이 나의 시도이다.
grep '\(.*\)\{3\}' myfile.txt
답변1
표준 단어 정의를 사용하세요.
GNU grep,3개 이상발생 횟수어떤 단어라도.
grep -E '(\W|^)(\w+)\W(.*\<\2\>){2}' file
GNU grep,단 3발생 횟수어떤 단어라도.
grep -E '(\W|^)(\w+)\W(.*\<\2\>){2}' file | grep -Ev '(\W|^)(\w+)\W(.*\<\2\>){3}'
POSIX awk,단 3~의 출현어떤 단어라도.
awk -F '[^_[:alnum:]]+' '{ # Field separator is non-word sequences split("", cnt) # Delete array cnt for (i=1; i<=NF; i++) cnt[$i]++ # Count number of occurrences of each word for (i in cnt) { if (cnt[i]==3) { # If a word appears exactly 3 times print # Print the line break } } }' file
~을 위한3개 이상그런 일이 발생하면
==
으로 변경하십시오>=
.동등한 골프 공 단일 라인:
awk -F '[^_[:alnum:]]+' '{split("",c);for(i=1;i<=NF;i++)c[$i]++;for(i in c)if(c[i]==3){print;next;}}' file
GNU Awk, 3번만 나타남단어
ab
.gawk 'gsub(/\<ab\>/,"&")==3' file
~을 위한3개 이상그런 일이 발생하면
==
으로 변경하십시오>=
.
읽을 거리
\2
는역참조.\w
\W
\<
\>
GNU Grep의 특수 표현식.[:alnum:]
POSIX캐릭터 클래스.
답변2
이와 같이?
egrep '(\<.+\>).+\<\1\>.+\<\1\>'
egrep
(또는grep -E
) 활성화확장 정규식, 이는 역참조에 필요합니다.\<.+\>
최소 1개의 문자가 포함된 모든 단어와 일치합니다.\<
resp는\>
단어 경계와 일치합니다(시도에서는 단어 경계를 전혀 고려하지 않았습니다)..+
하나 이상의 문자 시퀀스와 일치합니다(시도에서는 다음과.*
같은 시퀀스 일치를 사용했습니다).영또는 더 많은 문자! )
- 역참조를 사용하여 일치하는 시퀀스가 두 번째(
\1
) 및 세 번째(\1
다시) 발생하는지 확인합니다.- 일치 항목 사이에 하나 이상의 문자( ) 시퀀스를 허용하므로
.+
"foo bar foo dorbs foo godly"가 일치합니다("foo"라는 단어가 3번 나타남). - 인접한 단어(예: "foo foo foo")만 일치시키려면 다음과 같이 사용하세요
[[:space:]]+
.
- 일치 항목 사이에 하나 이상의 문자( ) 시퀀스를 허용하므로
답변3
귀하의 질문은 해당 줄의 단어가 3번 이상 존재하면 해당 줄을 인쇄하고, 그렇지 않으면 폐기한다는 의미라고 가정합니다. awk
더 읽기 쉽고 사용자 정의 가능한 솔루션을 위해 를 사용하겠습니다 .
awk -F '\\W+' '{
delete c; for (i=1;i<=NF;i++) if (length($i) && ++c[$i]==3) {print; next}
}' file
이는 각 행에서 발생하는 횟수를 계산하는 모든 필드에 대한 루프입니다. 어떤 단어라도 3번 도달하면 해당 줄이 인쇄됩니다.삭제배열하고 다음 줄로 이동합니다. 또한 카운트의 빈 필드에 인쇄되지 않도록 필드 길이에 대한 테스트가 있습니다.
-F
여기에서는 다양한 필드 구분 기호 및/또는 많은 필드 구분 기호를 추가하여 "단어"의 의미를 쉽게 사용자 정의할 수 있습니다(표준 BRE 및 ERE가 지원됨). 위의 단어 구분 기호는 _
및 [:alnum:]
: awk -F '\\W+'
또는 awk -F '[^_[:alnum:]]+'
일치하는 단어 경계와 유사한 문자를 제외한 모든 문자입니다 grep
.
인간 언어의 경우 문자를 제외한 모든 것과 같은 다른 단어 경계를 원할 수 있습니다. 예를 들어 awk -F '[^[:alpha:]]+'
문자와 숫자를 제외하거나 awk -F '[^[:alnum:]]+'
밑줄뿐만 아니라 단어에 대시를 사용합니다 awk -F '[^-_[:alnum:]]+'
.
설정하지 않으면 -F
공백 문자만 사용됩니다.
답변4
GNU sed
확장 정규식 모드에서-E
한 줄에 정확히 3번 반복되는 모든 단어를 감지합니다 .
$ r1='.*\<\1\>'
$ r2=$r1$r1 r3=$r2$r1
$ sed -Ee "
/\<(\w+)\>$r2/! d
/\<(\w+)\>$r3/d
" file
- Perl은 해시를 사용하여 단어를 키로 저장하고 현재 행의 개수를 값으로 저장합니다.
$ perl -lne 'my %h;
$h{$_}++ for /\w+/g;
print if grep { $_ == 3 } values %h;
' file