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