我有2列2个tab separated
文件。列1 1是数和列2是ID。像这样的两个例子:
例如文件1:
188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1
例如文件1:
91 PSMD7
2217 TPT1
223 ATP5C1
156 TCP1
我想找到的基于第2列(列ID)2个文件共同行,并作出新的制表符分隔的文件,其中有4列:COLUMN1是ID(公共ID)COLUMN2是从文件1的数,栏3是多少从文件2和column4是2列3的比值的log 2值(这意味着LOG2(列2 /栏3))。例如关于ID“TPT1”:第一列是TPT1,列2为188,栏3是2217和第4栏为log 2(2217分之188)等于-3.561494。这里是一个预期的输出:
预期输出:
TPT1 188 2217 -3.561494
ATP5C1 420 223 0.9133394
我想,在AWK
使用下面的代码要做到:
awk 'NR==FNR { n[$2]=$0;next } ($2 in n) { print n[$2 '\t' $1] '\t' $1 '\t' log(n[$1]/$1)}' file1.txt file2.txt > result.txt
此代码不会返回我的期望。你知道如何解决它?
$ awk -v OFS="\t" 'NR==FNR {n[$2]=$1;next} ($2 in n) {print $2, $1, n[$2], log(n[$2]/$1)/log(2)}' file1 file2
TPT1 2217 188 -3.5598
ATP5C1 223 420 0.913346
我会用join实际合并文件,而不是AWK:
$ join -j2 <(sort -k2 file1.txt) <(sort -k2 file2.txt) |
awk -v OFS="\t" '{ print $1, $2, $3, log($2/$3)/log(2) }'
ATP5C1 420 223 0.913346
TPT1 188 2217 -3.5598
该join
程序,那么,加入一个共同的价值两个文件。它要求根据联接列进行排序的文件,但你的例子都没有,因此数据文件的在线sort
ing。然后其输出被管道输送到awk来计算每行的数的log2
和产生制表符分隔的结果。
替代用perl如果你关心的是(而且不想用awk的CONVFMT
变量一塌糊涂),它给你更多的默认精度:
$ join -j2 <(sort -k2 a.txt) <(sort -k2 b.txt) |
perl -lane 'print join("\t", @F, log($F[1]/$F[2])/log(2))'
ATP5C1 420 223 0.913345617745818
TPT1 188 2217 -3.55980420318967
AWK +排序方法
awk ' { print $0,FILENAME }' ellyx.txt ellyy.txt | sort -k2 -k3 | awk ' {c=$2;if(c==p) { print c,a,$1,log(a/$1)/log(2) }p=c;a=$1 } '
与给定的输入
$ cat ellyx.txt
188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1
$ cat ellyy.txt
91 PSMD7
2217 TPT1
223 ATP5C1
156 TCP1
$ awk ' { print $0,FILENAME }' ellyx.txt ellyy.txt | sort -k2 -k3 | awk ' {c=$2;if(c==p) { print c,a,$1,log(a/$1)/log(2) }p=c;a=$1 } '
ATP5C1 420 223 0.913346
TPT1 188 2217 -3.5598
$