두 가지 유형의 패턴을 사용 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が返されます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に制限し、ファイルから1行あたり6列のIDリストを読み取るには、次の手順を実行しますids.txt
。
awk -F, 'NR==FNR{ids[$1]; next} $7 ~ /Sodalis/ || $6 in ids' ids.txt myfile.txt