나는 최근에 "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를 사용하여 각 단어의 시작 부분에서 합계를 제거한 다음 다음을 사용하여 표시합니다.pro
con
sed
pro
con
sort
uniq -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
^pro
pro
con
awk '/^con/{arr[$0]=$0}; /^pro/{c=gensub(/pro/, "con", 1)
if (c in arr) print substr(c, 4)}' /usr/share/dict/words
… … 빈스 빈스 직업 전문적인 직업 보행자 워커드 워커 전화