【发布时间】:2021-02-02 04:52:17
【问题描述】:
我有一个包含制表符分隔符 .tsv 文件的文件夹,如下所示:
Sample_1.tsv 文件:
Gene Center Start End Strand Ref Sample ID_Sample HGVps Other_Columns
AAA . 111111 111111 + T C Test p.A123B NA
AAA . 111112 111112 + C A Test p.C456D NA
BBB . 222222 222222 + A T Test p.E789F NA
CCC . 333331 333331 + G C Test p.G10H NA
CCC . 333332 333332 + A T Test p.I11J NA
CCC . 333333 333333 + T C Test p.K12L NA
我在另一个文件夹中有每个基因的几个文件(后来称为 Genes.tsv)。
AAA 基因的 AAA.tsv 文件:
Coordinates Some_col_1 Change Some_col_2 Consequence Other_Columns
chr1:111111-111111 NA chr1:g.111111T>C NA Ms AAA A123B NA
BBB 基因的 BBB.tsv 文件:
Coordinates Some_col_1 Change Some_col_2 Consequence Other_Columns
chr2:222222-222222 NA chr2:g.222222A>T NA Syn BBB E789F NA
CCC 基因的 CCC.tsv 文件:
Coordinates Some_col_1 Change Some_col_2 Consequence Other_Columns
chr3:333332-333332 NA chr3:g.333332A>T NA Nns CCC I11J NA
chr3:333339-333339 NA chr3:g.333339T>C NA Syn CCC K12L NA
等等。对于其他基因。
请注意,在“后果”列中,三个元素由空格分隔,包括基因名称和我感兴趣的 HGVps 代码。
我将这些简化的表格作为示例放在这里,但实际上我有更多的列。请参阅下图了解正确的列号:
Image-1:Sample_1.tsv_with_correct_column_numbers (注意:黄色是我想要保留的行。)
Image-2:Genes.tsv_with_correct_column_numbers (注意:绿色是与 Sample_1 相同的元素。)
基本上,我想将具有其他 Genes.tsv 文件中的列的 Sample_1.tsv 的所有行保存在一个新文件中。标准是 Genes Columns+Start+End+Ref+Sample 相同或 仅 HVps 列(如果其他列不匹配)。
我想要获得的东西:
Gene Center Start End Strand Ref Sample ID_Sample HGVps Other_Columns
AAA . 111111 111111 + T C Test p.A123B NA
BBB . 222222 222222 + A T Test p.E789F NA
CCC . 333332 333332 + A T Test p.I11J NA
CCC . 333333 333333 + T C Test p.K12L NA
我认为可以使用 bash/awk/grep 来选择感兴趣的行。
我不完全知道如何做到这一点,但我想继续的方式应该是这样的:
Create a new file called Sample_1_ok.tsv
Add column names in Sample_1_ok.tsv
If Gene+Start+End+Ref+Sample columns from Sample_1.tsv are the same in Genes.tsv files:
Append Sample_1.tsv line in Sample_1_ok.tsv
Else if HGVps column from Sample_1.tsv is the same in Genes.tsv files:
Append Sample_1.tsv line in Sample_1_ok.tsv
您对如何进行有什么建议吗?
非常感谢!
【问题讨论】:
-
您要处理多少个
<gene>.tsv文件?您能否提供一些有关哪些值与<gene>.tsv文件中的哪些列名匹配的详细信息(例如,AAA.tsv中有 3 个111111副本 ...这是Start和End) ?您是否测试过任何代码,如果可以,请分享一下?第一个想法是awk...将<gene>.fsvviles 解析为一个数组,然后处理Sample_1.fsv以在数组中匹配;如果“太多”<gene>.fsv文件,则可能将<gene>.fsv数据重新格式化为与Sample_1.fsv格式相同的单个文件,然后comm数据 -
我有 ~ 50 个
<gene>.tsv文件。对于<gene>.tsv文件的列的详细信息,Coordinates列对应于chr#:Start-End coordinates。因为它是单字母突变,Start和End通常是相同的(但并非总是如此,这就是我想区分这两个坐标的原因)。Change列,我只想获取>符号前后的两个大写字母。这两个字母中的第一个对应于Ref,第二个对应于Sample。至少Consequence列包含Gene的名称(AAA、BBB、CCC、...)和HGVps。 -
@markp-fuso 通过使用 awk 匹配,我从
<gene>.tsv中提取了感兴趣的列:awk -F'\t' -v OFS='\t' 'match($1, /([0-9]+)\-([0-9]+)/, a) && match($3, /(.)>(.)/, b) && match($5, /([A-Z]+) ([A-Z][0-9]+[A-Z])/, c) {print c[1],a[1],a[2],b[1],b[2],c[2]}' <gene>.tsv > <gene_filtered>.tsv所以下一步是比较Sample_1.tsv和这些新表? -
fwiw,我建议将您的
awk代码移到问题中;让其他人更容易理解这个问题,如果他们不必去挖掘 cmets 试图将所有东西拼凑在一起 -
@markp-fuso 好的,我会记住您对代码的推荐。