У меня есть фрагмент кода, который дает мне первый столбец, который начинается с определенного «гена» шаблона и выглядит так:
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
Спасибо!
@setop: звучит как хороший совет, но из всех моих попыток я добился только чего-то вроде "gene = caiD_1 - 1" ... как вы используете $ n? Я не смог найти по нему документацию





вот решение:
{ # 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?
Точно. i - число, поэтому i-1 имеет смысл. $ i - это содержимое i-го поля текущей обрабатываемой записи.
В качестве общего решения awk поддерживает $ n в точечном поле n. Вы можете создать переменную n с любым вычислением, которое вам подходит, например, n = column - 1.