
У меня есть такой файл:
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