1

我的制表符分隔文件如下所示:

  ID   Pop  snp1  snp2  snp3  snp4  snp5
  AD62  1  0/1   1/1   .    1/1   0/.
  AD75  1  0/0   1/1   .    ./0   1/0
  AD89  1  .     1/0   1/1  0/0   1/.

我想分隔列(从第 3 列开始),以便将由“/”字符分隔的值分隔成自己的列。但是,也有一些列缺少值(它们仅包含“.”字符),我希望将其视为“./”。使两个“。” 然后将字符分成它们自己的列。例如:

  ID   Pop  snp1     snp2     snp3     snp4     snp5
  AD62  1    0    1   1    1   .    .   1    1   0    .
  AD75  1    0    0   1    1   .    .   .    0   1    0
  AD89  1    .    .   1    0   1    1   0    0   1    .

谢谢

4

4 回答 4

1

您可以使用 sed:

sed -e 's/ \. /\.\t\. /g' -e 's/\//\t/g' <your_file>
于 2012-07-10T15:08:00.510 回答
0

试过这个并且效果很好,您可以根据您的要求进行调整。

假设数据在data.txt文件中。

cat data.txt | sed 1d | tr '/' '\t'| sed 's/\./.\t./g'

这给出了输出,但是您需要解决被弄乱的空格和制表符。

于 2012-07-10T15:04:29.053 回答
0

一种相当健壮的方式,使用awk和一些if语句:

awk '{ for (i = 1; i <= NF; i++) if (i >= 3 && i < NF && NR == 1) printf "%s\t\t", $i; else if (i == NF && NR == 1) print $i; else if ($i == "." && NR >= 2) printf ".\t.\t", $i; else { sub ("/", "\t", $i); if (i == NF) printf "%s\n", $i; else { printf "%s\t", $i; } } }' file.txt

分成多行:

awk '{ for (i = 1; i <= NF; i++)
   if (i >= 3 && i < NF && NR == 1) printf "%s\t\t", $i;
   else if (i == NF && NR == 1) print $i;
   else if ($i == "." && NR >= 2) printf ".\t.\t", $i;
   else {
      sub ("/", "\t", $i);
      if (i == NF) printf "%s\n", $i;
      else {
         printf "%s\t", $i;
      }
   }
}' file.txt

高温高压

于 2012-07-11T06:57:35.340 回答
0

这可能对您有用(GNU sed):

sed ''1s/\t/&&/3g;s/\t\.\t/\t.\t.\t/g;y/\//\t/' file
于 2012-07-10T15:16:38.177 回答