query_ids
다음과 같은 여러 줄이 포함된 파일이 있습니다 .
id1
id2
id3
grep idx
에서 일치하는 ID를 찾는 데 사용하고 있습니다 my_file
.
이러한 일치 항목을 새 파일로 리디렉션합니다 matches
. 또한 모든 불일치를 파일로 리디렉션 하기 위해 with 옵션을
사용했습니다 . 나는 이 작은 스크립트를 사용하고 있습니다.grep
-v
mismatches
#!/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_ids
my_file
따라서 임의의 ID가 선택되면 id3이 통과 grep id3 missing
하고 grep id3 my_file
둘 다 일치 항목을 반환한다고 가정해 보겠습니다. <br>
내 코드가 mismatches
파일에 id3을 할당하는 이유는 무엇입니까?
- 주변 따옴표를 제거하려고 시도했지만
$i
결과는 변경되지 않았습니다. 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
여기서는 grep
의 query_ids
행 을 쿼리 문자열( 즉, 정규 표현식이 아님)로 처리하고 전체 단어( 예: 일치하지 않도록 ) 로 일치시키도록 -f
요청합니다 .grep
query_ids
-F
my_file
-w
id2
id23
첫 번째 명령은 ID가 포함된 모든 행을 추출합니다. 두 번째 명령은 ID가 포함되지 않은 모든 줄을 추출합니다.
여기에는 어떤 종류의 루프도 필요하지 않습니다.