awkを使用して一致するデータを選択して抽出する方法は?

awkを使用して一致するデータを選択して抽出する方法は?

私のファイル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

関連情報