我的制表符分隔文件如下所示:
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 .
由于
答案 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