如何使用 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

我需要第五列和第六列仅包含一个字符的所有行。

结果应该如下所示:

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,GT,或者当前行是否是文件的第一行。如果是这样,它将打印该行。

测试的$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

相关内容