csv 文件操作:比较两个 csv 文件和 return 所有与 header 匹配的行
csv file operation: compare two csv files and return all matched line with header
我正在尝试比较两个 CSV 文件的列,并将所有匹配的行保存到带有 header 的新 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[,]=[=15=];next} A[,]' 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 的 header,如果 header 名称在两个文件中相同,例如如果 file1 的 startpos
和 endpos
更改为 start
和 end
或 vice-versa.
有什么办法可以不使用完全相同的 header 名称吗?所以我预期的输出文件将是这样的:
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
您可以使用其他条件 FNR == 1
:
awk -F, 'NR==FNR {A[,]=[=10=]; next} FNR == 1 || (,) 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
我正在尝试比较两个 CSV 文件的列,并将所有匹配的行保存到带有 header 的新 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[,]=[=15=];next} A[,]' 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 的 header,如果 header 名称在两个文件中相同,例如如果 file1 的 startpos
和 endpos
更改为 start
和 end
或 vice-versa.
有什么办法可以不使用完全相同的 header 名称吗?所以我预期的输出文件将是这样的:
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
您可以使用其他条件 FNR == 1
:
awk -F, 'NR==FNR {A[,]=[=10=]; next} FNR == 1 || (,) 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