私のファイル1には遺伝子リストのみが含まれ、ファイル2にはより長い遺伝子リストと遺伝子統計が含まれています。ファイル1の遺伝子と一致する統計を見つけて、新しいファイル3に入れようとしています。特定のFile 2の33列のうち、私が望む唯一の統計は列29にありますが、まだこの項目に閉じ込められているため、現在File 1遺伝子の各列に関する情報を見つけるコードを書いています。
たとえば、私のデータは次のようになります。
ファイル1:
Gene
ACE
BRCA
HER.2
NOS
P53
PTGIS
ファイル2:
gene_id Gene pval beta maf ... qval ...
12345 ACE 0.01 300 100 0.0008
67890 UMOD.1 0.002 400 45 0.047
00008 HER.2 0.02 123 98 0.56
34587 CICP3 0.05 55 12 0.77
67859 HER 0.003 600 33 0.234
私が望むのは29列です。私は29列前後にもっと熱があることを示唆しましたが、私はstackexchangeの経験がありません。より良い例のために、より大きなデータに仕上げる方法がある場合は教えてくださいqval
。...
すぐにやります。
これらのサンプル・データ・セットを使用すると、出力ファイル 3 は次のようになります。
Gene qval
ACE 0.0008
HER.2 0.56
私は一致する2つの遺伝子のすべての列を提供すると思ったコードを試しましたが、現在は空の出力ファイルを提供しています。
awk 'BEGIN{FS=OFS="\t"} {sub(/\.[0-9]+$/,"",$2)} FNR==NR{$30="";sub(/[[:space:]]+$/,"");a[$2]=$0;next} $1 in a{print a[$2],$NF}' file2.txt file1.txt > file3.txt
さらに別のアプローチを試しましたが、より具体的には29列を取得しますが、これは実行されますが、出力一致はいくつかの一致する遺伝子データのみを提供し、一致するデータが必要な他のものは「NA」のままです。
awk '{printf("%s\t%s\n", $2, $29)}' originalfile2.txt > file2.txt
awk '{
split($1,k,".")
}
NR==FNR {
a[k[1]]=$1
next
}
k[1] in a {
print $0 "\t" a[k[1]]
}' file1.txt file2.txt > file3.txt
awk '{$3=""; print $0}' file3.txt | column -t > file3.txt
sed -e '1i\Gene \ qval' file3.txt | column -t > file3.txt
答え1
あなたの遺伝子名のリストはDOSテキストファイルですね。これは、各遺伝子名の末尾に追加のキャリッジリターンがあることを意味します。これは、ファイル間で名前が一致しないことを意味します。これは出力が空であることを意味します。
.dllを使用して遺伝子リストをUnixテキストファイルに変換しますdos2unix
。その後、コードを使用してくださいムルさんがコメントを残しました。(2番目のファイルがタブで区切られていると仮定):
awk -v OFS='\t' 'FNR == NR {a[$0]++; next}; $2 in a {print $2, $29}' file1 file2 >file3
または、awk
各行の末尾からキャリッジリターンを削除します。
awk -v OFS='\t' '{ sub("\r$", "") } FNR == NR {a[$0]++; next}; $2 in a {print $2, $29}' file1 file2 >file3