![创建一个可以存储根据另一个文件中的值计算出的值的字段](https://linux22.com/image/115684/%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%8F%AF%E4%BB%A5%E5%AD%98%E5%82%A8%E6%A0%B9%E6%8D%AE%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%80%BC%E8%AE%A1%E7%AE%97%E5%87%BA%E7%9A%84%E5%80%BC%E7%9A%84%E5%AD%97%E6%AE%B5.png)
我有两个文件,第一个文件(制表符分隔)如下所示:
1 100 371 R1,R2,R4 12
5 167 16 R2,R5 5
8 242 490 R1,R3,R4 11
另一个看起来像:
R1 0.167
R2 0.171
R3 0.156
R4 0.162
R5 0.159
我想在第一个文件中再添加一个字段,该字段中的值是第二个文件中 R1、R2、...、R5 的匹配值之和,然后除以第四个字段中的值。
例如第一行有R1,R2,R4,所以我想要的值为(0.167+0.171+0.162)/12 = 0.0416667
预期输出:
1 100 371 R1,R2,R4 12 0.0416667
5 167 16 R2,R5 5 0.066
8 242 490 R1,R3,R4 11 0.0440909
awk命令怎么写?
答案1
awk解决方案:
awk 'NR==FNR{ a[$1]=$2; next };{ len=split($4,b,","); s=0;
for(i=1;i<=len;i++) s+=a[b[i]]; $6=s/$5 }1' file2 OFS='\t' file1 | column -tx
输出:
1 100 371 R1,R2,R4 12 0.0416667
5 167 16 R2,R5 5 0.066
8 242 490 R1,R3,R4 11 0.0440909
a[$1]=$2
- 从第二个文件捕获键/值split($4,b,",")
- 将第一个文件的第四个字段拆分为“键”数组len
- 块的数量s+=a[b[i]]
- 累积匹配“键”的值