ORを使用して2つのパターンを一致させるには?

ORを使用して2つのパターンを一致させるには?

두 가지 유형의 패턴을 사용 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열입니다.

私の問題は、6番目の列のIDが他の列の値と一致する可能性があることです。いいえID。Sodalis種のIDが必要な場合は、2342サンプル3では正しく表示されますが、サンプル4(3列)のスコア値でもあります。

awk -F, '$6==2342'正しい列からIDを取得するために名前を使用することも、単に使用することもできますが、次の2grep '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'残念ながら2番目のパターンがスコア値となるサンプル4と一致するため、4が返されます2342grep特定の列に基づいて値を取得する方法はありますか?また、この結果を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に制限し、ファイルから1行あたり6列のIDリストを読み取るには、次の手順を実行しますids.txt

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

おすすめ記事