我搜索了相关问题,但找不到适合我问题的答案。例如,我有一个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 +/+ +/+ +/+
任何帮助都将不胜感激。
答案 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 +/+ +/+ +/+