将基因型转换为 0/1

将基因型转换为 0/1

我有一个如下所示的文件:

1    rs6687776    1020428    T    C    T    C    T    C    C    C    T    C    C    C    T    C

第四列和第五列是两种不同的可能等位基因在那个网站。我需要更改第 6 列,以显示0是否存在T等位基因以及1是否存在C等位基因。我的文件是 20805 x 459。因此应该如下所示:

1   rs6687776   1020428 T   C   0   1   0   1   1   1   0   1   1   1   0   1

我试过了:

cat file | while read line
do if [ [,6-] = [,4] ]
then
    echo "0"
    echo "1"
fi
done

但我最终得到了一个0由 和交替组成的文件1,长度为 41610 行。或许AWK更有用吗?

答案1

这是另一种awk方法:

$ awk '{a[$4]=0;a[$5]=1; for(i=6;i<=NF;i++){$i=a[$i]}}1;' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

解释

  • a[$4]=0;a[$5]=1;a:使用两个键创建数组,$4并且$5。的值$4设置为0, 的值设置$5为 1。
  • for(i=6;i<=NF;i++){$i=a[$i]}:对于从 6 到最后一个的每个字段编号,将该字段设置为数组中存储的找到的核苷酸的任何值。

  • 1;: awk 是“打印这一行”的简写形式。


你也可以用 Perl 来实现:

$ perl -lane 's/$F[3]/0/ for @F[5..$#F]; s/$F[4]/1/ for @F[5..$#F]; print "@F"' file
1 rs6687776 1020428 T C 0 1 0 1 1 1 0 1 1 1 0 1

这是同样的想法。 make-aperl作用就像awk将空白上的每一行分割到数组中@F。然后,我们将第 4 个字段( $F[3],数组从 0 开始)中找到的核苷酸的所有情况替换为 ,0将第 5 个字段 ( $F[4]) 中的所有情况替换为1。这for @F[5..$#F]意味着替换仅适用于字段 6 到最后。最后,打印修改后的数组。

答案2

您可以尝试以下操作awk

awk '{ for (i = 6; i <= NF; i++) { if ($i == $4) { $i = 0; } else if ($i == $5) { $i = 1; } } } 1' file

或者:

awk '{ for (i = 6; i <= NF; i++) { $i = ($i == $4) ? 0 : 1; } } 1' file

答案3

总是有不止一种方法可以做到这一点; sed 是 Unix 流编辑器——它对于修改输入很有用,如下所示:

while read one two three four five rest
do
  echo $one $two $three $four $five $(echo $rest | sed -e 's/T/0/g' -e 's/C/1/g')
done < input

-e 标志给它一个要解析的表达式; “s”函数搜索并用第二个参数(0 或 1)替换第一个参数(T 或 C)。您可以为 sed 提供多个表达式来执行多项操作。循环的其余部分仅保留前五个字段。

相关内容