Попытка напечатать предыдущую строку в awk, но вместо этого появляется, чтобы напечатать текущую строку дважды - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь использовать awk для имитации uniq -d в определенных полях, чтобы напечатать строку, читаемую в данный момент, а также предыдущую строку, используя первое решение из здесь , но, похоже, для печати одна и та же строка дважды.

Вот пример материала в файле.

130 chr1    7237    7238    0k9imgkt
135 chr1    7637    7637    b9gko
138 chr1    7908    7908    kob9g
139 chr1    8045    8045    34e5rg  4r
151 chr1    8329    8329    b
151 chr1    8346    8346    345y46htyh
151 chr1    8346    8346    76jtuj
152 chr1    8358    8358    asfge

Вот строка, которую я использовал. Я пытаюсь сравнить строки на основе второго, третьего и четвертого полей; если две или более строки идентичны в этих полях, выведите всю эту строку полностью. Также можно предположить, что строки отсортированы по полям 1, 2 и 3.

awk '{prev = $0; ++array[$2$3$4]; if(array[$2$3$4] == 2) {print; curr = $0; $0 = prev; print; $0 = curr}}' file

Вот что я хочу, чтобы вывод был.

151 chr1    8346    8346    345y46htyh
151 chr1    8346    8346    76jtuj

А вот каков результат.

151 chr1    8346    8346    76jtuj
151 chr1    8346    8346    76jtuj

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Если я правильно понял ваш вопрос, не могли бы вы попробовать следующее.

awk 'FNR==NR{a[$2$3$4]++;next} a[($2$3$4)]>1' Input_file Input_file

ИЛИ

awk '{k=$2 FS $3 FS $4} FNR==NR{a[k]++;next} a[k]>1'  Input_file Input_file

Вывод будетследующим образом.

151 chr1    8346    8346    345y46htyh
151 chr1    8346    8346    76jtuj
1 голос
/ 05 апреля 2019

Вот еще одно решение awk, которое не читает входной файл дважды и работает, даже если ваш ввод не отсортирован.

awk '(k = $2 FS $3 FS $4) in a {
  print a[k] $0; a[k] = ""; next
} { a[k] = $0 ORS }' file
1 голос
/ 05 апреля 2019

Вы печатаете одну и ту же строку дважды.Не совсем понятно, какой должна быть логика, но одно из утверждений print должно быть print curr или, возможно, print prev. Также одинокий prev ничего не делает и выглядит так, как будто он остался после ошибки редактирования.

Возможно, вы ищете что-то вроде

awk '++array[$2$3$4] >= 2 {
        if(prev)print prev;
        print;
        prev = ""; next }
    { prev = $0 }' file

Если это не дает того, что вы хотите, возможно, отредактируйте ваш вопрос, чтобы более подробно описать, что, по вашему мнению, должен делать ваш текущий скрипт;код, который не делает то, что вы хотите, на самом деле не является хорошим способом сообщить, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...