我有一个这样的数据集:
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
行选项或通过设置内部FS
awk 变量来相应地设置字段分隔符。
如果您希望输出也以逗号分隔,则需要设置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