在awk中合并和处理两个选项卡分隔的文件,并创建一个新文件

在awk中合并和处理两个选项卡分隔的文件,并创建一个新文件,awk,Awk,我有两个选项卡分隔的文件,有两列。第1列是数字,第2列是ID。如以下两个示例所示: 示例文件1: 188 TPT1 133 ACTR2 420 ATP5C1 942 DNAJA1 91 PSMD7 2217 TPT1 223 ATP5C1 156 TCP1 示例文件1: 188 TPT1 133 ACTR2 420 ATP5C1 942 DNAJA1 91 PSMD7 2217 TPT1 223 ATP5C1 156 TCP1 我想根据第2列列ID查找2个文件的公共行,并

我有两个选项卡分隔的文件,有两列。第1列是数字,第2列是ID。如以下两个示例所示:

示例文件1:

188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1
91  PSMD7
2217    TPT1
223 ATP5C1
156 TCP1
示例文件1:

188 TPT1
133 ACTR2
420 ATP5C1
942 DNAJA1
91  PSMD7
2217    TPT1
223 ATP5C1
156 TCP1
我想根据第2列列ID查找2个文件的公共行,并创建一个新的选项卡分隔文件,其中有4列:column1是ID common ID column2是来自文件1的数字,column3是来自文件2的数字,column4是第2列和第3列之比的log2值,即log2column2/column3。例如,关于ID TPT1:第1列是TPT1,第2列是188,第3列是2217,第4列是log2188/2217,等于-3.561494。 以下是预期输出的示例:

TPT1    188 2217    -3.561494
ATP5C1  420 223 0.9133394
预期产出:

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:

$ 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 -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
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

$

可能是重复的谢谢。不,这是一个不同的oneNo,这正是您的尝试不起作用的原因,尽管还有其他问题,您没有在n中使用$1\t$2作为键,因此它将为空。如果Awk脚本使用单引号,则不能使用单引号。切换到双引号或类似答案中的解决方法。代码段的作用是什么?请解释一下。与OP的尝试相比,变化非常小。你应该能够从问题中的信息中找出答案。