Несколько проходов с awk и порядком исполнения
Вопрос из двух частей:
Часть первая: сначала у меня есть последовательность AATTCCGG, которую я хочу изменить на TAAGGCC. Я использовал gsub, чтобы заменить A на T, C на G, G на C и T на A. К сожалению, awk выполняет эти команды последовательно, поэтому я получил AAACCCC. Я обошел это, используя верхний и нижний регистр, затем преобразовав обратно в верхний регистр значения, но я хотел бы сделать это в один шаг, если это возможно.
пример:
echo AATTCCGG | awk '{gsub("A","T",$1);gsub("T","A",$1);gsub("C","G",$1);gsub("G","C",$1);print $0}'
ВЫХОД: AAAACCCC
Часть вторая: есть ли способ заставить awk запускаться до конца файла для одного набора инструкций перед запуском второго набора? Я пробовал некоторые из следующих, но безуспешно
для набора данных
1 A
2 B
3 C
4 D
5 E
Я использую следующий канал, чтобы получить данные, которые я хочу (просто пример)
awk '{if ($1%2==0)print $1,"E";else print $0}' test | awk '{if ($1%2==0 && $2=="E") print $0}'
Я использую канал для перезапуска программы, однако я обнаружил, что быстрее, если мне не нужно перезапускать программу.
3 ответа
Вот метод, который я нашел для первой части вопроса, используя awk. Он использует массив и цикл for.
cat sub.awk
awk '
BEGIN{d["G"]="C";d["C"]="G";d["T"]="A";d["A"]="T";FS="";OFS=""}
{for(i=1;i<(NF+1);i++)
{if($i in d)
$i=d[$i]}
}
{print}'
Input/Output:
ATCG
TAGC
Это может быть эффективно решено с tr
:
$ echo AATTCCGG | tr ATCG TAGC
Что касается второй части (на самом деле это должен быть другой вопрос): нет, это невозможно awk
Труба - это путь.
Для второй части попробуйте эту команду:
awk '{if ($1%2==0)print $1,"E"}' test