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 から開始して) 分離したいと考えています。ただし、値が欠落している列もあり ("." 文字のみが含まれています)、これを "./." のように扱いたいと考えています。2つの「。」文字は独自の列に分割されます。例えば:

  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

これはうまくいくかもしれません(GNU sed):

sed ''1s/\t/&&/3g;s/\t\.\t/\t.\t.\t/g;y/\//\t/' file
于 2012-07-10T15:16:38.177 に答える
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

HTH

于 2012-07-11T06:57:35.340 に答える
0

これを試してうまくいきました。必要に応じてこれを微調整できます。

データがファイルにあると仮定しdata.txtます。

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

これにより出力が得られますが、混乱しているスペースとタブを回避する必要があります。

于 2012-07-10T15:04:29.053 に答える