2009-10-08 40 views
5

我有程序输出看起来像这样(标签DELIM):如何将Unix的/ Sed's/Perl的音译(tr)应用于特定列?

$ ./mycode somefile 
    0000000000000000000000000000000000  238671 
    0000000000000000000000000000000001  0 
    0000000000000000000000000000000002  0 
    0000000000000000000000000000000003  0 
    0000000000000000000000000000000010  0 
    0000000000000000000000000000000011  1548.81 
    0000000000000000000000000000000012  0 
    0000000000000000000000000000000013  937.306 

我想要做的是对第一列仅:其中G与A,1 C,2代替0和3以T 。 有没有一种方法可以直接从“mycode”管道输出管道输出。 屈服这样的:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  238671 
... 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT  937.306 
+1

有人可以建议我们如何使用awk来做到这一点?我认为这会有用。 – Vijay 2009-10-09 05:12:56

回答

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. 删除换行符(来自追加步骤)及其之后的所有数字(最多空格)

至少在我的数据上工作过。

编辑
啊,你想要一个班轮...

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]*//" 
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' 
+2

或-F:perl -lawnF'/ \ t /'-e'$,=“\ t”; $ F [0] =〜Y/0123/ACGT /; print @F' – ysth 2009-10-08 14:52:53

+0

@ysth我总是忘记'-F'。 – 2009-10-08 14:56:48

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 
相关问题