OR을 사용하여 두 패턴을 일치시키는 방법은 무엇입니까?

OR을 사용하여 두 패턴을 일치시키는 방법은 무엇입니까?

두 가지 유형의 패턴을 사용 grep하고 awk일치시켜야 하는데 구문을 알 수 없습니다.

내 파일의 값은 다음과 같습니다.

sample1,gicode1,123,4541,221,3661,Sodalis sp.1
sample2,gicode1,123,0322,12,112342,Sodalis sp.2
sample3,gicode1,112,4541,00,2342,Candidatus sp.
sample4,gicode1,2341,4541,00,9606,Homo sapiens

가 있는 행 수를 가져와야 합니다 Sodalis. 때로는 이름이 부정확할 수 있으므로 이름(따라서 일곱 번째 열)에 있거나 택시를 기반으로 할 수 있습니다. ID는 6열입니다.

내 문제는 때때로 여섯 번째 열의 ID가 다른 열의 값과 일치할 수 있다는 것입니다.아니요ID. Sodalis종의 ID를 원하면 2342샘플 3에서는 올바르게 표시되지만 샘플 4(3열)의 점수 값이기도 합니다.

awk -F, '$6==2342'올바른 열에서 ID를 가져오기 위해 이름을 사용하거나 간단히 사용할 수 있지만 grep 'Sodalis'다음과 같이 두 가지를 결합하는 데 문제가 있습니다.

cat myfile.txt | grep "Sodalis" OR awk -F, '$6==2342' | wc -l

반환 값은 3이어야 하지만 2(에 대해 grep)를 얻거나 1(에 대해 awk)만 얻습니다. 나는 ||다음과 같은 다양한 변형을 시도했습니다 &.

cat myfile.txt | grep "Sodalis" || cat myfile.txt | awk -F, '$6==2342'

그러나 그것은 대답 1을 제공합니다.

grep을 사용하여도 사용할 수 있다는 것을 알고 있지만 grep -E 'Sodalis|2342'불행하게도 두 번째 패턴이 점수 값이 되는 샘플 4와 일치하기 때문에 4가 반환됩니다 2342. grep특정 열을 기반으로 값을 얻는 방법이 있습니까 ? 또한 이 결과를 Sodalis.txt.

답변1

여기에는 grep이 필요하지 않습니다. awk는 패턴과 완벽하게 일치할 수 있습니다.

awk -F, '/Sodalis/ || $6==2342' myfile.txt | wc -l

또는

awk -F, '/Sodalis/ || $6==2342 {c++} END{print c}' myfile.txt

(의견에 대한 응답) Sodalis일치 항목을 열 7로만 제한하고 파일에서 한 줄당 열 6 ID 목록을 읽으려면 다음을 수행하십시오 ids.txt.

awk -F, 'NR==FNR{ids[$1]; next} $7 ~ /Sodalis/ || $6 in ids' ids.txt myfile.txt

관련 정보