我的程序输出看起来像这样(tab delim):
$ ./mycode somefile
0000000000000000000000000000000000 238671
0000000000000000000000000000000001 0
0000000000000000000000000000000002 0
0000000000000000000000000000000003 0
0000000000000000000000000000000010 0
0000000000000000000000000000000011 1548.81
0000000000000000000000000000000012 0
0000000000000000000000000000000013 937.306
我想要做的只是在FIRST列上:用A替换0,用C替换1,用G替换2,用T替换3 有没有办法可以直接从“mycode”音译输出。 产生这个:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 238671
...
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT 937.306
答案 0 :(得分:8)
使用Perl:
C:\> ./mycode file | perl -lpe "($x,$y)=split; $x=~tr/0123/ACGT/; $_=qq{$x\t$y}" AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 238671 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACC 1548.81 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACG 0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT 937.306
您可以在Bash中使用单引号:
$ ./mycode file | perl -lpe '($x,$y)=split; $x=~tr/0123/ACGT/; $_="$x\t$y"'
正如@ysth在评论中指出的那样,perl
实际上提供了命令行选项-a
和-F
:
-a autosplit mode with -n or -p (splits $_ into @F) ... -F/pattern/ split() pattern for -a switch (//'s are optional)
使用那些:
perl -lawnF'\t' -e '$,="\t"; $F[0] =~ y/0123/ACGT/; print @F'
答案 1 :(得分:7)
应该可以用sed来做,把它放在一个文件中(你可以用命令行来做,用-e,不要忘记那些分号,或者每行使用单独的-e)。 (编辑:请记住,由于您的数据是制表符分隔的,它实际上应该是一个制表符,而不是空格,在第一个s //中,确保您的编辑器不会将其转换为进入空间)
#!/usr/bin/sed -f
h
s/ .*$//
y/0123/ACGT/
G
s/\n[0-3]*//
并使用
./mycode somefile | sed -f sedfile
或chmod 755 sedfile
并执行
./mycode somefile | sedfile
执行的步骤是:
至少为我的数据工作过。
修改的:
啊,你想要一个单行......
GNU sed
sed -e "h;s/ .*$//;y/0123/ACGT/;G;s/\n[0-3]*//"
或老派sed(没有分号)
sed -e h -e "s/ .*$//" -e "y/0123/ACGT/" -e G -e "s/\n[0-3]*//"
答案 2 :(得分:3)
@sarathi
\ AWK解决方案
awk '{gsub("0","A",$1);gsub("1","C",$1);gsub("2","G",$1);gsub("3","T",$1); print $1"\t"$2}' temp.txt