grep을 사용하여 여러 문자열을 정확하게 일치시키세요

grep을 사용하여 여러 문자열을 정확하게 일치시키세요

여러 문자열에 대해 정확한 문자열 일치를 찾기 위해 grep을 사용하고 있습니다.

약 천만 개의 행과 10개의 열이 있는 대규모 데이터 파일에서 다음 세 개의 문자열을 찾고 싶다고 가정해 보겠습니다. 아래의 정확한 문자열을 포함하는 모든 줄을 찾기 위해 이 파일을 쿼리하고 싶습니다. 다행히도 1개의 열에만 "rs number"가 있으므로 열을 지정할 필요가 없습니다. rs123 rs246 rs689653

다음 표현식을 시도했는데 이 문자열이 포함된 모든 옵션이 반환되었습니다. 어떤 경우에는 정확히 일치하는 행만 원하기 때문에 "rs123456"과 같은 행이 표시됩니다.

grep -E 'rs123|rs246|rs689653' queriedfile.txt

^그런 다음 and를 사용하여 다음 표현식을 시도했지만 $내 쿼리와 일치하는 결과를 받지 못했습니다(몇 가지가 있다는 것을 알고 있습니다).

grep -E '^rs123$|^rs246$|^rs689653$' queriedfile.txt

답변1

-w전체 단어에 대한 일치를 제한하기 위해 명령줄 옵션을 추가할 수 있습니다.

$ printf 'rs123456\nrs246\n' | grep -wE 'rs123|rs246|rs689653'
rs246

또는 단어 앵커를 명시적으로 추가하세요.

$ printf 'rs123456\nrs246\n' | grep -E '\b(rs123|rs246|rs689653)\b'
rs246

(당신은 가깝고 ^- $하지만 그건철사-앵커).

답변2

네가 원한다면정밀한문자열 일치:

grep -Fwf <(printf "%s\n" rs123 rs246 rs689653) file

여기서는 -F정확한 문자열 일치(정규식 없음)를 제공하고 -w전체 단어이며 -f프로세스 교체에서 제공되는 파일에서 "패턴"을 읽습니다.

일치하는 단어가 더 많아 printf 섹션이 매우 길어지면 쉘 배열을 사용하여 저장할 수 있습니다.

words=( rs123 rs246 rs689653 )
grep -Fwf <(printf "%s\n" "${words[@]}") file

또는 awk가 귀하의 요구에 적합할 수도 있습니다.

awk -F '\t' '
    $6 == "rs123"
    $6 == "rs246"
    $6 == "rs689653"
' file

필요에 따라 실제 필드 구분 기호와 필드 번호를 바꿉니다.

관련 정보