Как получить все столбцы на основе двух столбцов с помощью awk?

Как получить все столбцы на основе двух столбцов с помощью awk?

У меня есть такой файл:

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-02 chr1    20009838    20009838    -   CCA    TMCO4    Missense
AADA-03 chr1    76397825    76397825    GTCA T     ASB17    Missense
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-04 chr1    176762782   176762782   TCG  C     PAPPA2   Missense
AADA-04 chr1    183942764   183942764   -    T     COLGAL   Missense
AADA-05 chr1    186076063   186076063   A    TGC   HMCN1    Silent
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Мне нужны все строки, где 5-й и 6-й столбцы содержат только один символ.

И результат должен выглядеть так:

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Я попробовал это использовать.

awk -F'\t' '$5' filename | awk -F'\t' '$6' filename | wc -l

Я знаю, что это неправильно, но кто-нибудь может исправить мою ошибку?

решение1

awk 'NR==1{print; next}
     $5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/' input.txt

Объяснение

NR==1{print; next}

Это выводит первую строку (заголовок) без каких-либо условий и переходит к следующей строке.

$5 ~ /^[A-Z]$/ && $6 ~ /^[A-Z]$/

Это условное выражение: если 5-й и 6-й аргументы оба соответствуют одной заглавной букве, то вывести строку (в этом случае команда печати подразумевается, поскольку является инструкцией по умолчанию для любого условия).

$5и $6обозначают 5-й и 6-й столбцы каждой строки.

&&— логический оператор И.

~— оператор сопоставления регулярных выражений. Он возвращает значение true, если аргумент слева соответствует регулярному выражению справа.

/^[A-Z]$/является регулярным выражением (regexp). Символ "/" является разделителем для regexp, "^" обозначает начало строки (или строки), "$" - конец, а "[AZ]" означает все заглавные буквы от A до Z.

решение2

awk '$5 ~ /^[ACGT]$/ && $6 ~ /^[ACGT]$/ || NR == 1' data.in

Это позволит, для заданных данных, сгенерировать

sample  chr        start      end      ref   alt    gene    effect
AADA-01 chr1    12336579    12336579    C    T     VPS13D    Silent
AADA-03 chr1    94548954    94548954    C    A     ABCA4    Missense
AADA-05 chr1    186076063   186076063   A    T     HM1      Silent

Скрипт awkпроверяет столбцы 5 и 6, чтобы определить, являются ли они одним из символов A, C, Gили T, или является ли текущая строка первой строкой файла. Если это так, он выведет эту строку.

Тест $5 ~ /^[ACGT]$/означает «проверить, соответствует ли столбец пять регулярному выражению ^[ACGT]$». Регулярное выражение будет соответствовать всему, что содержит один символ из заданного набора ( [ACGT]).

^и $являются «якорями», они будут соответствовать только в самом начале и самом конце (соответственно) указанных данных (столбец пять и столбец шесть).

&&и ||являются логическими операторами И и ИЛИ.

NR— порядковый номер текущей входной строки. Если NR == 1тогда текущая строка — это строка заголовка в файле. Поскольку строка заголовка не соответствует критериям вывода ( refи altне является одиночной буквой, а значит, не будет соответствовать регулярному выражению), необходимо провести эту отдельную проверку, чтобы убедиться, что она будет выводиться.

решение3

perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in

Связанный контент