如何将列中的值拆分为单独的列

时间:2012-07-10 14:58:46

标签: linux awk

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

  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 个答案:

答案 0 :(得分:1)

您可以使用sed:

sed -e 's/ \. /\.\t\. /g' -e 's/\//\t/g' <your_file>

答案 1 :(得分:0)

尝试过并运作良好,您可以根据自己的要求进行调整。

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

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

这给出了输出,但你需要解决一些混乱的空格和制表符。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed ''1s/\t/&&/3g;s/\t\.\t/\t.\t.\t/g;y/\//\t/' file

答案 3 :(得分: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