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

每列的Awk比较连续行并添加值,awk,Awk,我搜索了相关的问题,但找不到适合我问题的答案。例如,我有一个6行3列的文件 id sample1 sample2 sample3 6 +/+ +/+ +/- 16 -/- +/+ +/+ 20 +/- +/+ +/+ 21 +/- +/+ +/+ 22 +/+ +/+ -/- 25 +/+ +/+ +/+ 对于每一列,我需要将一行的字符串与下一行的字符

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

id  sample1 sample2  sample3
6   +/+      +/+      +/-
16  -/-      +/+      +/+
20  +/-      +/+      +/+
21  +/-      +/+      +/+
22  +/+      +/+      -/-
25  +/+      +/+      +/+   
对于每一列,我需要将一行的字符串与下一行的字符串进行比较,并根据值,使用AWK报告一个数字,基于以下比较表(无论field1和field2的顺序):

因此,期望输出为:

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  +/+      +/+      +/+   

任何帮助都将不胜感激。

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  +/+      +/+      +/+

另一个类似的
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  +/+      +/+      +/+

你试过什么吗?很好的解决办法。我只是想弄清楚,如果列数可变,它是如何工作的。感谢您的帮助。对于可变列数,您需要使用for循环和printf替换print语句。
$ 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  +/+      +/+      +/+