awk сравнивает соседние строки и печатает на основе операторов if - PullRequest
0 голосов
/ 13 июля 2020

У меня есть один файл с несколькими строками (считывается из генома), и они отсортированы (в зависимости от их расположения). Теперь я хочу l oop над этими строками, и если несколько строк имеют одинаковый идентификатор (столбец 4), я хочу сохранить либо первый, если столбец 3 является плюсом, либо последний, если столбец три является минусом. Это код m, но похоже, что моя переменная (lastID) не обновляется должным образом после каждой строки. Чаевые очень приветствуются.

awk 'BEGIN {lastline=""; lastID=""}
{if ($lastline != "" && $4 != $lastID)
        {print $lastline; lastline=""};
if ($3 == "+" && $4 != $lastID)
        {print $0; lastline=""}
else if ($3 == "+" && $4 == $lastID)
        {lastli=""}
else if ($3 == "-")
        {lastline=$0}; 
lastID=$4
}' file

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Для доступа к значению переменной в awk вы просто используете имя переменной, как в C и большинстве других языков, основанных на Алголе. Вы не ставите перед ним $, как если бы вы делали это с ракушкой. Попробуйте изменить:

$lastline != "" && $4 != $lastID

на:

lastline != "" && $4 != lastID

et c.

Это может быть то, что вы пытаетесь сделать (ваш раздел BEGIN делал ничего полезного, поэтому я просто удалил его):

awk '
    (lastline != "") && ($4 != lastID) {
        print lastline
        lastline=""
    }
    $3 == "+" {
        if ($4 == lastID) {
            lastli=""
        }
        else {
            print $0
            lastline=""
        }
    }
    $3 == "-" {
        lastline=$0
    } 
    { lastID=$4 }
' file

При таком разумном форматировании вы можете видеть, что lastli никогда не используется нигде, кроме тех, где он установлен на "", так что, вероятно, это ошибка - возможно, это предполагается, что это lastline, и в этом случае его можно сделать общим, а не устанавливать в обеих ветках if и else?

0 голосов
/ 13 июля 2020

вы можете захотеть использовать собственную структуру condition{statement} awk. Обратите внимание, что макет кода не является общепринятым, но мне легче читать короткие инструкции.

$ awk '$lastline!="" && $4 != $lastID {print lastline; lastline=""}
       $3=="+"       && $4 != $lastID {print; lastline=""}
       $3=="+"       && $4 == $lastID {lastli=""}
       $3=="-"                        {lastline=$0}
                                      {lastID=$4}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...