在下面的awk
中,我尝试根据$1
(变量TL)的总和,为file2
中的每个匹配$3+$4
的分数添加一个惩罚file1
。然后$4
中的file1
值除以TL
并乘以100(此值为变量S)。最后,$2
-S中的file2
会在$2
中提供更新的file2
结果。由于数学不是我的强项,因此可能是更好的方法,但这是我能想到的。谢谢你:)。
file1 space delimited
ACP5 4 1058 0
ACTB5 10 1708 79
ORAI1 2 952 0
TBX1 9 1932 300
file2 tab-delimited
ACP5 100.00
ACTB 100.00
ORAI1 94.01
TBX1 77.23
所需的输出 tab-delimited
---
是一个示例计算,不是输出的一部分
ACP5 100.00
ACTB 89.59 ---- $3+$4=1787 this is TL (comes from file1), $4/TL*100 is 4.42, $2 in file2 is 100 - 4.42 = 95.58 ----
ORAI1 94.01
TBX1 63.79
AWK
awk '
FNR==NR{ # process each line
TL[$1]=($3+$4);next} ($1 in TL) # from file1 store sum of $3 and $4 in TL
{S=(P[$4]/TL)*100;printf("%s\t %.2f\n",$1, $2-S) # store $4/TL from file1 in S and subtract S from $2 in file2, output two decimal places
}1' OFS="\t" file1 FS="\t" file2 # update and define input
当前输出
ACP5 100.00
ACTB 100.00
ORAI1 94.01
TBX1 77.23
答案 0 :(得分:0)
正如评论中指出的那样,问题尚不完全清楚。由于无法发表评论,因此我将提供一种解决方案,可以根据要求计算值。
awk '
NF==4 { S[$1] = 100 * $4 / ($3 + $4) }
NF==2 { printf("%s\t%.2f\n", $1, $2 - S[$1]) }
' file1 file2
文件1
ACP5 4 1058 0
ACTB 10 1708 79
ORAI1 2 952 0
TBX1 9 1932 300
文件2
ACP5 100.00
ACTB 100.00
ORAI1 94.01
TBX1 77.23
输出
ACP5 100.00
ACTB 95.58
ORAI1 94.01
TBX1 63.79
说明:
该脚本通过使用S
作为键,将$1
值计算并存储在关联数组中来工作。这是在由NF==4
过滤的块中完成的,因此它将仅在第一个文件(仅有4个字段的文件)中运行。最后,对于代表第二个文件的NF==2
,使用printf并通过从S
中减去相应的$2
值来打印结果。
观察:请记住,正如@kvantour指出的那样,您提供的示例未遵循问题中的指示。例如,89.59的值是从哪里来的?最终结果是95.58,就像我提供的脚本输出一样