【问题标题】:csv file operation: compare two csv files and return all matched line with headercsv 文件操作:比较两个 csv 文件并返回所有匹配的带有标题的行
【发布时间】:2022-01-11 09:53:15
【问题描述】:

我正在尝试比较两个 CSV 文件的列并将所有匹配的行保存到带有标题的新 CSV 文件中。以下是示例文件

file1:
ID,type,gene,startpos,endpos,product    
C20775336,marker,gene1,1895,2166,ID=gene1;Name=maker-C20
C20775337,marker,gene2,895,1166,ID=mRNA1;Parent=gene1;N
C20775339,marker,gene3,1895,1962,Parent=mRNA1
C20775335,marker,gene4,2795,2962,ID=CDS1;Parent=mRNA1
C20775338,marker,gene5,895,1166,ID=mRNA1;Parent=gene1;N

file2:
Id,start,End
C2002,895,1166
C2003,1895,2166
C2004,2795,2962

在这里,我尝试将 file1 的第 4 列和第 5 列与 file2 的第 2 列和第 3 列进行比较,如果匹配,则将其保存到新的 CSV 文件中。

使用这个命令awk -F',' 'NR==FNR{A[$2,$3]=$0;next} A[$4,$5]' file2 file1我得到这个输出:

C20775336,marker,gene1,1895,2166,ID=gene1;Name=maker-C20
C20775337,marker,gene2,895,1166,ID=mRNA1;Parent=gene1;N
C20775335,marker,gene4,2795,2962,ID=CDS1;Parent=mRNA1
C20775338,marker,gene5,895,1166,ID=mRNA1;Parent=gene1;N

但我也想要 file1 的标题,如果两个文件中的标题名称相同,例如如果 file1 的 startposendpos 更改为 startend 或反之亦然。

有没有什么办法没有相同的标题名称,可以做到。所以我预期的输出文件将是:

output:
ID,type,gene,startpos,Endpos,product    
C20775336,marker,gene1,1895,2166,ID=gene1;Name=maker-C20
C20775337,marker,gene2,895,1166,ID=mRNA1;Parent=gene1;N
C20775335,marker,gene4,2795,2962,ID=CDS1;Parent=mRNA1
C20775338,marker,gene5,895,1166,ID=mRNA1;Parent=gene1;N

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    你可以使用另一个条件FNR == 1:

    awk -F, 'NR==FNR {A[$2,$3]=$0; next} FNR == 1 || ($4,$5) in A' f2 f1
    
    ID,type,gene,startpos,endpos,product
    C20775336,marker,gene1,1895,2166,ID=gene1;Name=maker-C20
    C20775337,marker,gene2,895,1166,ID=mRNA1;Parent=gene1;N
    C20775335,marker,gene4,2795,2962,ID=CDS1;Parent=mRNA1
    C20775338,marker,gene5,895,1166,ID=mRNA1;Parent=gene1;N
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多