【发布时间】:2020-05-21 15:29:00
【问题描述】:
我正在对一些基因组数据进行滑动窗口分析,并使用 awk 来完成。
- 第 1 列:表示染色体名称。
- 第 2 列和第 3 列:表示位置(基于 0 的符号)。
- 第 4 列和第 5 列:感兴趣的值。
我需要做什么来获取 X 行(窗口大小为 X)并且:
- 获取第 1 列的所有不同值(即此窗口内的所有不同染色体)
- 为第 1 列中的每个不同值获取第 2 列的最小值(即每个染色体的最小值)
- 为第 1 列中的每个不同值获取第 3 列的最大值(即,对于每个染色体,最大值)
- 第 4 列的平均值。
- 第 5 列的平均值。
然后开始相同的过程(取 X 行),但在下面开始 Y 行(即 window step=Y)。
例如,假设我使用 10 (X=10) 的窗口大小和 5 (Y=5) 的窗口步长。我的数据示例可能是:
A 85 86 .043 .021
A 86 87 .031 .014
A 87 88 .035 .016
A 88 89 .033 .015
A 89 90 .031 .014
A 90 91 .031 .014
A 91 92 .032 .015
B 1 2 .030 .013
B 2 3 .038 .018
B 3 4 .032 .014
B 4 5 .030 .013
B 5 6 .034 .016
B 6 7 .032 .015
B 10 11 .033 .015
B 11 12 .045 .022
B 12 13 .055 .029
B 13 14 .059 .032
B 20 21 .058 .031
B 22 23 .059 .031
B 24 25 .064 .035
B 26 27 .063 .034
B 28 29 .058 .031
B 30 31 .063 .034
B 108 109 .063 .034
B 109 110 .067 .037
B 110 111 .066 .037
B 111 112 .061 .033
B 112 113 .061 .033
B 113 114 .056 .029
B 114 115 .058 .031
我想要的输出是:
10 A_85_92;B_1_4 0.0336 0.0154
15 A_90_91;B_1_12 0.0337 0.0155
20 B_4_25 0.0469 0.0239
25 B_12_110 0.0609 0.0328
30 B_26_115 0.0616 0.0333
这个输出有:
- 第一列:窗口标识符。可以是窗口的第一个或最后一个 NR。在这种情况下是最后一个 NR,即 10、15 等。-
- 该窗口内的不同染色体,以及每个染色体内的开始(最小)和结束(最大)位置。在此示例中,对于第一个窗口(从第 1 行到第 10 行),我有 A 和 B 染色体,A 从位置 85 到位置 92,B 从位置 1 到 4。使用“_”和染色体分隔位置使用“;”,但这不是强制性的。
- 在 $4 和 $5 列上计算的平均值。在我们的示例中,分别为 0.0336 和 0.0154。
下一个窗口从第 5 行转到第 15 行,然后从 10 转到第 20 行,然后从 15 转到第 25 行,以此类推。
到现在为止:
awk -v OFS="\t" 'BEGIN{window=10;step=5}
{
mod=NR%window; if(NR<=window){count++}
else
{ N[$1]++;{min=$2}{if ($2 < min) min = $2};{max=$3}{if ($3 > max) max = $3}; sum1-=array1[mod]; sum2-=array2[mod]}
sum1+=$4;
sum2+=$5;
array1[mod]=$4;
array2[mod]=$5;
}
(NR%slide)==0{for (p in N) print NR,p, max, min, sum1/count, sum2/count}' toy
结果:
15 B 11 12 0.0337 0.0155
20 B 24 25 0.0469 0.0239
25 B 109 110 0.0609 0.0328
30 B 114 115 0.0616 0.0333
因此,我无法正确获取窗口内的所有染色体以及每个染色体的最小值和最大值。另外我正在使用应该是 10 的第一个窗口,但我不知道为什么。
任何输入?提前致谢
【问题讨论】:
标签: awk