공통 접두사가 있는 어근을 검색하는 정규식

공통 접두사가 있는 어근을 검색하는 정규식

나는 최근에 "pro-"와 "con-"을 접두사로 공유하는 사전의 단어에 대해 궁금해졌습니다. 예를 들면 행진/양보, 생산/지도, 고백/고백, 진보/당대회 등이 있다. 기본적으로 ^pro(.+)$일치하는 단어와 ^con(.+)$캡처 그룹의 내용이 동일한 단어를 찾고 있습니다 .

내 원래 원시인 명령은 다음과 같습니다.

sed -nr 's/^con(.+)$/\1/Ip' /usr/share/dict/words | \
xargs -I SUFFIX -n1 grep -i '^proSUFFIX$' /usr/share/dict/words

일치하는 "pro-" 단어가 있을 때마다 전체 "con-" 단어를 출력하는 것이 작동하는 것 같습니다. 문제는 속도가 매우 느리다는 것입니다. 잠재적인 일치 항목마다 호출되므로 grep매번 전체 사전을 검색해야 합니다. up/down 단어만 포함하는 임시 파일을 만들어 작업 속도를 높일 수 있지만, 파일을 작성하지 않고도 이 작업을 수행할 수 있는 효율적인 방법이 있어야 할 것 같습니다.

이런 종류의 교차 검색에 완벽한 도구가 GNU 세계에 있습니까?

답변1

질문 자체에 대한 이전 의견에서 :

egrep '^(pro|con).* /usr/share/dict/words | sed -nE 's/^(pro|con)(.*)/\2/p' | sort | uniq -d 

pro 및 con 접두사가 모두 포함된 모든 동의어 목록을 제공합니다.

이니셜은 and 접두사가 붙은 모든 egrep단어를 포착합니다. 그런 다음 , list를 사용하여 각 단어의 시작 부분에서 합계를 제거한 다음 다음을 사용하여 표시합니다.proconsedproconsortuniq -d오니목록에 중복된 항목이 있습니다.

답변2

그러면 pro|con 접두사가 없는 단어가 인쇄됩니다.

grep '^\(pro\|con\)' /usr/share/dict/words | cut -c 4- | sort | uniq -c | awk '$1 == 2 {print $2}'

답변3

이 특별한 경우 - 모든 con...단어가 단어 앞에 나열 되도록 정렬된 입력 - 일치하는 행을 배열에 저장 pro...하는 데 사용할 수 있으며 일치하는 행에 도달하면 결과가 배열에 있는 경우 로 바꾸고 루트를 인쇄 합니다 . :awk^con^proprocon

awk '/^con/{arr[$0]=$0}; /^pro/{c=gensub(/pro/, "con", 1)
if (c in arr) print substr(c, 4)}' /usr/share/dict/words

빈스
빈스
직업
전문적인
직업
보행자
워커드
워커
전화

관련 정보