awk用匹配的`另一个文件的总和来更新文件

时间:2018-02-20 13:28:31

标签: awk

在下面的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

1 个答案:

答案 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,就像我提供的脚本输出一样