Awk печатает столбец, хранящийся в массиве, и предыдущий столбец

У меня есть фрагмент кода, который дает мне первый столбец, который начинается с определенного «гена» шаблона и выглядит так:

awk -F '\t|;' '{for(i=9;i<=NF;i++){if ($i~/^gene=/){column=$i}} print column, column}' file

и файл выглядит так

contig_1    Prodigal:2.6    CDS 28  609 .   +   0   ID=PROKKA_00001;eC_number=1.-.-.-;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1031    1813    .   +   0   ID=PROKKA_00015;eC_number=4.2.1.-;gene=caiD_1;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1031    1813    .   +   0   ID=PROKKA_00015;eC_number=0.0.0.0;gene=caiD_1;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1832    2533    .   -   0   ID=PROKKA_00016;gene=gmuR;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 43  1014    .   +   0   ID=PROKKA_00014;inference=...;WayMoreColumns

поэтому некоторые строки содержат «ген», некоторые нет (они мне не нужны), но некоторые дают дополнительную информацию в предыдущем столбце с «eC_number». Поскольку одно и то же имя «ген» может быть дано (в редких случаях) для разных генов, это помогает определить, какой из них на самом деле (пример в строках 2 и 3).

Есть ли странный способ сказать «столбец - $ 1», чтобы напечатать и предыдущий столбец, например содержит массив "столбец" этой информации? Или мне следует отдельно проверить поля, начинающиеся с «ген» и начинающиеся с «eC-number»?

В качестве вывода было бы нормально включить предыдущий столбец, независимо от того, начинается ли он с «eC_number» или «ID», потому что очистка после этого должна быть простой. Но «ген» должен быть в строке, одно значение eC_number бесполезно.

Желаемый результат:

eC_number=4.2.1.-   gene=caiD_1
eC_number=0.0.0.0   gene=caiD_1
ID=PROKKA_00016 gene=gmuR

Спасибо!

В качестве общего решения awk поддерживает $ n в точечном поле n. Вы можете создать переменную n с любым вычислением, которое вам подходит, например, n = column - 1.

Setop 09.03.2018 16:39

@setop: звучит как хороший совет, но из всех моих попыток я добился только чего-то вроде "gene = caiD_1 - 1" ... как вы используете $ n? Я не смог найти по нему документацию

crazysantaclaus 09.03.2018 17:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вот решение:

{ # for each line
    col = 0
    for(i=9; i<=NF; i++) { # search
        if ($i~/^gene=/) {
            col = i
        }
    }
    if (col>0) { # if found
        print $col, $(col-1) # print column and previous one
    }
}

сохраните его в "filter.awk" или что-то в этом роде и запустите:

awk -F '\t|;' -f filter.awk file

это отлично работает, спасибо. Не могли бы вы объяснить, что на самом деле делает разное хранение совпадающих столбцов {col = i} в вашем скрипте и моем {column = $i}? В моем случае он присваивает его полю, а в вашем сохраняет номер, поэтому вы можете выполнить на нем i-1?

crazysantaclaus 09.03.2018 18:06

Точно. i - число, поэтому i-1 имеет смысл. $ i - это содержимое i-го поля текущей обрабатываемой записи.

Setop 10.03.2018 19:39

Другие вопросы по теме