grep 루프: 한 파일의 각 줄을 쿼리로 사용하여 다른 파일과 일치하는 콘텐츠를 찾습니다. 출력이 일관되지 않는 이유는 무엇입니까?

grep 루프: 한 파일의 각 줄을 쿼리로 사용하여 다른 파일과 일치하는 콘텐츠를 찾습니다. 출력이 일관되지 않는 이유는 무엇입니까?

query_ids다음과 같은 여러 줄이 포함된 파일이 있습니다 .

id1
id2
id3

grep idx에서 일치하는 ID를 찾는 데 사용하고 있습니다 my_file.
이러한 일치 항목을 새 파일로 리디렉션합니다 matches. 또한 모든 불일치를 파일로 리디렉션 하기 위해 with 옵션을
사용했습니다 . 나는 이 작은 스크립트를 사용하고 있습니다.grep-vmismatches

#!/bin/bash


for i in $(cat query_ids)
do 
    # saving matches 
    grep "$i" my_file >> matches
    # saving mismatches
    grep -v "$i" my_file >> missing
done

분명히 뭔가 잘못하고 있는 것 같습니다.
파일에서 일부 ID를 수동으로 검색할 때 해당 ID가 존재한다는 것을 missing알았 my_file습니다. 파일에는
I 에서 찾을 수 없는 missing파일의 ID 만 포함되어야 하지만 일치하는 항목을 찾았습니다.query_idsmy_file

따라서 임의의 ID가 선택되면 id3이 통과 grep id3 missing하고 grep id3 my_file둘 다 일치 항목을 반환한다고 가정해 보겠습니다. <br>

내 코드가 mismatches파일에 id3을 할당하는 이유는 무엇입니까?

  1. 주변 따옴표를 제거하려고 시도했지만 $i결과는 변경되지 않았습니다.
  2. echo "$i"또한 ID가 실제로 원형인지 확인하려고 노력했습니다 .

내가 무엇을 놓치고 있나요?

답변1

예를 들어 ID를 가져온 id1다음 해당 ID와 일치하는 모든 행을 로 가져오는 것뿐입니다 matches. 그런 다음 모든 행을 추출합니다.아니요에 일치시키세요 missing.

다음 ID의 경우 id2해당 ID와 일치하는 행은 에 추가되고 matches, 일치하지 않는 행은 id2에 추가됩니다 missing.

이제 missing포함되지 않은 모든 행을 포함시킨 id1다음, 포함되지 않은 모든 행을 포함하십시오 id2. 포함하는 행 id1과 포함하지 않는 행은 루프의 두 번째 반복에 id2나타납니다 .missing

대신 모든 ID를 동시에 고려하십시오.

grep -f query_ids -Fw    my_file >matches
grep -f query_ids -Fw -v my_file >missing

여기서는 grepquery_ids행 을 쿼리 문자열( 즉, 정규 표현식이 아님)로 처리하고 전체 단어( 예: 일치하지 않도록 ) 로 일치시키도록 -f요청합니다 .grepquery_ids-Fmy_file-wid2id23

첫 번째 명령은 ID가 포함된 모든 행을 추출합니다. 두 번째 명령은 ID가 포함되지 않은 모든 줄을 추출합니다.

여기에는 어떤 종류의 루프도 필요하지 않습니다.

관련 정보