여러 문자열에 대해 정확한 문자열 일치를 찾기 위해 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
필요에 따라 실제 필드 구분 기호와 필드 번호를 바꿉니다.