合并和处理2标签在AWK分隔的文件,并作出新的

问题描述 投票:0回答:3

我有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
3个回答
1
投票
$ 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

0
投票

我会用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程序,那么,加入一个共同的价值两个文件。它要求根据联接列进行排序的文件,但你的例子都没有,因此数据文件的在线sorting。然后其输出被管道输送到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

0
投票

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

$
© www.soinside.com 2019 - 2024. All rights reserved.