根据一列中的特定模式提取数据

根据一列中的特定模式提取数据

我有一个这样的数据集:

AAACCTGCAAGCGAGT-1,ENSG00000000419,DPM1,2
AAACCTGCAAGCGAGT-1,ENSG00000001497,LAS1L,1
AAACCTGCAAGCGAGT-1,ENSG00000002330,BAD,1
AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000002586,CD99,5
AAACCTGCAAGCGAGT-1,ENSG00000002834,LASP1,1
AAACCTGCAAGCGAGT-1,ENSG00000003056,M6PR,1
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2
AAACCTGCAAGCGAGT-1,ENSG00000004059,ARF5,2
AAACCTGCAAGCGAGT-1,ENSG00000004455,AK2,1
AAACCTGCAAGCGAGT-1,ENSG00000004468,CD38,8
AAACCTGCAAGCGAGT-1,ENSG00000004779,NDUFAB1,3
AAACCTGCAAGCGAGT-1,ENSG00000004975,DVL2,1
AAACCTGCAAGCGAGT-1,ENSG00000005022,SLC25A5,6

我想获取第三列包含线粒体基因的数据,其模式为“MT-”,例如上面的数据集,我想提取:

AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2

我使用这个命令:

awk '$3 ~/^MT-/ {print $1, $2, $3, $4} final_matrix.csv

但这没有用。

答案1

默认情况下,awk 期望以空格分隔字段 - 如果您的文件以逗号分隔,则需要使用命令-F行选项或通过设置内部FSawk 变量来相应地设置字段分隔符。

如果您希望输出也以逗号分隔,则需要设置OFS.

前任。

$ awk -F, 'BEGIN{OFS=FS} $3 ~ /^MT-/ {print $1, $2, $3, $4}' final_matrix.csv
AAACCTGCAAGCGAGT-1,ENSG00000002549,MT-CO3,2
AAACCTGCAAGCGAGT-1,ENSG00000003402,MT-CYB,2

答案2

所有答案都是正确的,此外您还可以打印整行。

并且无需进行字段解析。

awk  '/,MT-/{print}' final_matrix.csv

答案3

这个想法是正确的,但你忘了说明awk如何分隔列条目,以便$1与其余列区分开来$2。现在它只是在寻找一个空格来分隔文本,但最终找到了整行$1,根本没有找到$3。所以这$3 ~ ..只是一个错误条件,导致没有任何打印的行数。

awk -v FS=, -v OFS=, '$3 ~/^MT-/ {print $1, $2, $3, $4}' final_matrix.csv

答案4

鉴于您发布的示例,您可以这样做:

grep ',MT-/' final_matrix.csv

但如果你想使用 awk 并专注于第三个字段,那么它就是:

awk -F, '$3 ~ /^MT-/' final_matrix.csv

或者:

awk -F, 'index($3,"MT-")==1' final_matrix.csv

相关内容