Как я могу применить транслитерацию Unix's / Sed's / Perl (tr) только к определенному столбцу? - PullRequest
5 голосов
/ 08 октября 2009

У меня есть вывод программы, который выглядит следующим образом (разделитель табуляции):

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

То, что я хочу сделать, это только в первом столбце: заменить 0 на A, 1 на C, 2 на G и 3 на T. Есть ли способ, которым я могу транслитерировать этот вывод по прямой линии из "mycode". Выходя так:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA        238671
...
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACT        937.306

Ответы [ 3 ]

8 голосов
/ 08 октября 2009

Использование 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'
7 голосов
/ 08 октября 2009

Должна быть возможность сделать это с помощью 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. Transliterate
  4. добавить содержимое из пробела
  5. удалить символ новой строки (из шага добавления) и все цифры после него (до пробела)

По крайней мере, я работал над вашими данными.

EDIT :
Ах, вы хотели однострочник ...

GNU sed

sed -e "h;s/ .*$//;y/0123/ACGT/;G;s/\n[0-3]*//"

или old-school sed (без точек с запятой)

sed -e h -e "s/ .*$//" -e "y/0123/ACGT/" -e G -e "s/\n[0-3]*//"
3 голосов
/ 18 января 2013

@ саратхи

\ AWK решение для этого

awk '{gsub("0","A",$1);gsub("1","C",$1);gsub("2","G",$1);gsub("3","T",$1); print $1"\t"$2}' temp.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...