
この記事で全く同じ結果を得たいと思います(Linux/Unixからデータを抽出する上記と同じですが、次のような新しい入力ファイルがあります。
ABCB11 4 ACE 11
ABCB11 4 CHRM1 114
ABCB11 4 CHRM2 115
ABCB11 4 DRD2 158
ABCB11 4 EGF 164
ABCC8 5 ACE 11
ABCC8 5 ADRA1A 21
ABCC8 5 ADRA1B 22
ABCC8 5 ADRA1D 23
ABCC8 5 CHRM1 114
すべてのユニークな遺伝子を入手して結果を作りましょう。
私は両方の行から異なる値を取得した後、すべての行がfromidを持つことを望みます。正確な出力は私が望むものです。
ABCB11 = fromid=4,from=ABCB11
ABCC8 = fromid=5,from=ABCC8
ACE = fromid=11,from=ACE
CHRM1 = fromid=114,from=CHRM1
CHRM2 = fromid=115,from=CHRM2
DRD2 = fromid=158,from=DRD2
EGF = fromid=164,from=EGF
ADRA1A = fromid=21,from=ADRA1A
ADRA1B = fromid=22,from=ADRA1B
ADRA1D = fromid=23,from=ADRA1D
答え1
柱が4つあると仮定すると、これは2段階のソリューションです。
awk 'NR == FNR {if (s[$1]++ == 0)
{printf "%s = fromid=%s, from=%s\n", $1, $2, $1}; next};
!s[$3]++{printf "%s = fromid=%s, from=%s\n", $3, $4, $3}' file file
ABCB11 = fromid=4, from=ABCB11
ABCC8 = fromid=5, from=ABCC8
ACE = fromid=11, from=ACE
CHRM1 = fromid=114, from=CHRM1
CHRM2 = fromid=115, from=CHRM2
DRD2 = fromid=158, from=DRD2
EGF = fromid=164, from=EGF
ADRA1A = fromid=21, from=ADRA1A
ADRA1B = fromid=22, from=ADRA1B
ADRA1D = fromid=23, from=ADRA1D
答え2
出力順序が気に入らない場合は、次のようにします。
$ awk '!($1 in a){a[$1] = $2}
!($3 in a){a[$3] = $4}
END {
for(i in a) {
print i" = fromid="a[i]",from="i
}
}' file
EGF = fromid=164,from=EGF
CHRM1 = fromid=114,from=CHRM1
CHRM2 = fromid=115,from=CHRM2
ACE = fromid=11,from=ACE
ADRA1A = fromid=21,from=ADRA1A
DRD2 = fromid=158,from=DRD2
ABCB11 = fromid=4,from=ABCB11
ADRA1B = fromid=22,from=ADRA1B
ABCC8 = fromid=5,from=ABCC8
ADRA1D = fromid=23,from=ADRA1D