如何将Unix的/ Sed / Perl的音译(tr)仅应用于特定列?

时间:2009-10-08 08:56:38

标签: perl bash sed

我的程序输出看起来像这样(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

3 个答案:

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

执行的步骤是:

  1. 复制缓冲区以保留空间(替换上一行中保留的内容,如果有的话)
  2. 删除尾随内容(从第一个空格到行尾)
  3. 音译
  4. 追加持有空间内容
  5. 删除换行符(来自追加步骤)及其后面的所有数字(直到空格)
  6. 至少为我的数据工作过。

    修改的:
    啊,你想要一个单行......

    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