在awk中合并和处理两个选项卡分隔的文件,并创建一个新文件
我有两个选项卡分隔的文件,有两列。第1列是数字,第2列是ID。如以下两个示例所示: 示例文件1:在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个文件的公共行,并
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的尝试相比,变化非常小。你应该能够从问题中的信息中找出答案。