每列的awk比较连续的行并添加值

时间:2018-03-20 11:35:30

标签: awk

我搜索了相关问题,但找不到适合我问题的答案。例如,我有一个6行3列的文件。

id  sample1 sample2  sample3
6   +/+      +/+      +/-
16  -/-      +/+      +/+
20  +/-      +/+      +/+
21  +/-      +/+      +/+
22  +/+      +/+      -/-
25  +/+      +/+      +/+   

对于每一列,我需要将一行的字符串与下一列中的字符串进行比较,并根据这些值,使用AWK报告一个数字,基于以下比较表(无论field1的顺序和field2):

field1   field2   value
 +/+      +/+       0
 +/+      +/-       0.5
 +/-      +/-       1
 +/+      -/-       2
 +/-      -/-       2.5
 -/-      -/-       4

因此需要的输出:

id  sample1 sample2 sample3 result1  result2    result3
6   +/+      +/+      +/-     2        0           0.5
16  -/-      +/+      +/+     2.5      0           0
20  +/-      +/+      +/+     1        0           0
21  +/-      +/+      +/+     0.5      0           2
22  +/+      +/+      -/-     0 0      2
25  +/+      +/+      +/+   

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

另一个类似的awk

$ awk 'NR==FNR {a[$1,$2]=a[$2,$1]=$3; next}
       FNR==1  {print $0,"result1","result2","result3"; next}
               {print f0, a[f[2],$2], a[f[3],$3], a[f[4],$4]; 
                f0=$0; split($0,f)}
       END     {print}' score file | column -t

id  sample1  sample2  sample3  result1  result2  result3
6   +/+      +/+      +/-      2        0        0.5
16  -/-      +/+      +/+      2.5      0        0
20  +/-      +/+      +/+      1        0        0
21  +/-      +/+      +/+      0.5      0        2
22  +/+      +/+      -/-      0        0        2
25  +/+      +/+      +/+

答案 1 :(得分:0)

awk 解决方案:

awk 'NR == FNR{ if (NR > 1) a[$1$2] = $3; next }
     FNR == 1{ print $0, "result1\tresult2\tresult3"; next }
     id{ 
         print id, s2, s3, s4, 
               (a[$2 s2] == ""? a[s2 $2] : a[$2 s2]),
               (a[$3 s3] == ""? a[s3 $3] : a[$3 s3]),
               (a[$4 s4] == ""? a[s4 $4] : a[$4 s4]) 
     }
     { id = $1; s2 = $2; s3 = $3; s4 = $4 }
     END{ print $0 }' table.txt OFS='\t' data.txt | column -t

输出:

id  sample1  sample2  sample3  result1  result2  result3
6   +/+      +/+      +/-      2        0        0.5
16  -/-      +/+      +/+      2.5      0        0
20  +/-      +/+      +/+      1        0        0
21  +/-      +/+      +/+      0.5      0        2
22  +/+      +/+      -/-      0        0        2
25  +/+      +/+      +/+