我有一个这样的文件:
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
我需要第五列和第六列仅包含一个字符的所有行。
结果应该如下所示:
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 列。
&&
是逻辑运算符 AND。
~
是正则表达式匹配运算符。如果左侧的参数与右侧的正则表达式匹配,则返回 true。
/^[A-Z]$/
是一个正则表达式(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]
。
^
和$
是“锚点”,它们只会在给定数据(分别)的开头和结尾(第五列和第六列)匹配。
&&
和||
是逻辑 AND 和 OR 运算符。
NR
是当前输入行的序号。如果NR == 1
当前行是文件中的标题行。由于标题行不满足输出条件(ref
并且alt
不是单个字母,因此与正则表达式不匹配),因此必须进行此单独的测试以确保将其包含在输出中。
答案3
perl -lane 'print if $. == 1 or 2 == grep /^[A-Z]$/, @F[4,5]' data.in