Несколько проходов с 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 
Другие вопросы по тегам