両方のファイルでID列の一致するデータを見つけて計算する方法は?

両方のファイルでID列の一致するデータを見つけて計算する方法は?

染色体位置IDが一致する2つの遺伝子データセットがあります。ファイル1の染色体位置IDがファイル2に表示される回数を計算したいと思います。

たとえば、私のデータは次のようになります。

ファイル1(提案されているように、染色体位置は実際に私の125番目の列です...):

Gene  pval    ... Chromosome position ID
ACE   0.002   ... 01:3290834_CT_C_1
NOS   0.01    ... 03:3304593_GA_G_1
BRCA  0.004 . ... 06:6265733_GA_G_1
CYP3  0.34    ... 09:9433933_GA_G_1

ファイル2(染色体位置が最初の列):

Chromosome position ID  Gene  pval
01:1243933_GA_G_1       ACE   0.002
03:3304593_GA_G_1       NOS   0.01
06:6265733_GA_G_1       BRCA  0.004
09:9433933_GA_G_1       CYP3  0.34

一致する行を抽出することに関する多くの質問を見つけて、その質問に基づいてコードを適用しましたが、2つのファイル間の一致する染色体位置の数だけを取得したいと思います。

現在私は以下を使用しています:

awk -F'|' 'NR==FNR{c[$125]++;next};c[$125]' file2.csv file1.txt > file3.txt

wc -l file1.txt
wc -l file3.txt

ファイル1と3の行数が正確に予想されたものとは異なります(ファイル1のすべての内容がファイル2にあることを望みました)。何が起こっているかを確認するには、一致数を実行する方法を見つける必要があります。染色体位置の列はOKです。 「ファイル1のすべての染色体位置がファイル3に一致/表示されますか?」をエンコードする方法を見つけることができれば理想的でしょう。しかし、今はただ計算するだけです。

したがって、出力は、ファイル1の染色体位置列$ 125がファイル2の染色体位置列$ 1と一致する回数を数える数値になります。

私はLinuxを使用しています。

ベストアンサー1

awktailsortおよびを含むjoinソリューションですwc

join <(awk -F '\t' '{print $125}' file1 | tail -n +2 | sort) <(awk -F '\t' '{print $1}' file2 | tail -n +2 | sort ) | wc -l
3

説明する。

このソリューションでは、列がタブで区切られていると想定しています。awkfile1の125番目の列とfile2の最初の列が収集されます。tail -n +2収集された結果の最初の行を削除します。体系的な文書が必要sortなので必須です。join結果クロスセットがwcここに供給され、対応する行番号が返されます。

おすすめ記事