入力データがあり、awk / grep / sedを使用して値を解析して抽出したいと思います。
group-2 9 10 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 28 29 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-5 0 1 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM1,toid=114,use=1,z=1
group-2 29 30 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-5 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=CHRM2,toid=115,use=1,z=1
group-2 10 11 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-3 1 2 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=DRD2,toid=158,use=1,z=1
group-2 11 12 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-3 2 3 text color=black,from=ABCB11,fromid=4,order=2,thickness=3,to=EGF,toid=164,use=1,z=1
group-2 21 22 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-3 12 13 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ACE,toid=11,use=1,z=1
group-2 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-1 0 1 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1A,toid=21,use=1,z=1
group-2 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-1 1 2 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1B,toid=22,use=1,z=1
group-2 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
group-1 2 3 text color=black,from=ABCC8,fromid=5,order=2,thickness=3,to=ADRA1D,toid=23,use=1,z=1
デフォルトでは、「from =」と「fromid」、「to =」、および「toid =」から異なる値を取得したいと思います。出力がどのようにすべきかを以下に見ることができます。
希望の出力。 "from=" と "to=" で 1 行ずつ連結した値でなければなりません。 from = ABCB11は複数回表示されますが、一度だけ表示したいので、「to =」の値は出力に1回だけ必要です。
fromid型でもtoid型でも、両方の値から異なる値を取得した後、すべての行に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
上記と同じ出力が必要ですが、次の新しい入力ファイルがあります。
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
すべてのユニークな遺伝子を入手して結果を作りましょう。
答え1
awkを使用できます。連想配列一意性を主張するフィールドごとにインデックスを作成します(たとえば、フィールドto=
の一意の値($6
カンマ区切りフィールド))。
$ awk -F, '{split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;} END{for (id in arr) print arr[id]}' data.txt
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2
一意の項目の式fromid
は同じですが、フィールドとはとで$6
置き換えられます。$7
$2
$3
$ awk -F, '{split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;} END{for (id in arr) print arr[id]}' data.txt
ABCC8 = fromid=5,from=ABCC8
ABCB11 = fromid=4,from=ABCB11
toid
出力にデータと両方のデータが含まれるようにするには、fromid
式を組み合わせることができます。
awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt
おそらくラベルを変更する最も自然な方法(つまりtoid
、行から来てもテーブルのすべてのフィールドにラベルを付けること)は、出力を次のように渡すことです。fromid
sed
$ awk -F, '{
split($2,s,"="); arr[s[2]]=s[2]" = "$3","$2;
split($6,s,"="); arr[s[2]]=s[2]" = "$7","$6;
} END{for (id in arr) print arr[id]}' data.txt | sed 's/from/to/g'
ABCC8 = toid=5,to=ABCC8
EGF = toid=164,to=EGF
ADRA1A = toid=21,to=ADRA1A
ACE = toid=11,to=ACE
ABCB11 = toid=4,to=ABCB11
ADRA1B = toid=22,to=ADRA1B
ADRA1D = toid=23,to=ADRA1D
DRD2 = toid=158,to=DRD2
CHRM1 = toid=114,to=CHRM1
CHRM2 = toid=115,to=CHRM2
fromid <--> toid
内部的に交換を行うこともできますが、awk
このアプローチは意図をより明確にすると思います。次に、sed
最終式を逆に変更して別のテーブルを作成しますsed 's/to/from/g'
。
答え2
名前が「filename.txt」というファイルにあると仮定すると、最初のテーブルに対して次のことを試すことができます。
cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed -r 's/^.{5}//'
2番目のテーブルの場合:
cat filename.txt | awk -F "," '{ print $2 " = " $3 "," $6}' sed -r 's/^.{5}//'
頑張ってください!
編集:2番目のテーブルの場合:
cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed -r 's/^.{5}//' |
編集2:
cat filename.txt | awk -F "," '{ print $2 " = " $7 "," $6}' sed 's/^.....//' |
これは5点です。