染色体位置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
awk
tail
、sort
およびを含む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
説明する。
このソリューションでは、列がタブで区切られていると想定しています。awk
file1の125番目の列とfile2の最初の列が収集されます。tail -n +2
収集された結果の最初の行を削除します。体系的な文書が必要sort
なので必須です。join
結果クロスセットがwc
ここに供給され、対応する行番号が返されます。
答え2
あなたは近いです。努力する
awk 'FNR == 1 {next}; FNR==NR {P[$125]; next} $1 in P {P[$1]++} END {for (p in P) print p, P[p]+0}' file[12]
03:3304593_GA_G_1 1
01:3290834_CT_C_1 0
09:9433933_GA_G_1 1
06:6265733_GA_G_1 1
明らかに、file1のすべての場所がfile2に見つかるわけではありません。