使用文件名添加一个col



我有大约100个文件,它们是a.vcf;b.vcf, d.vcf……例如:a.vcf

##contig= ID=chr1,length=249250621 
##contig= ID=chr2,length=243199373 
##contig= ID=chr3,length=198022430 
##contig= ID=chr4,length=191154276 

b.vcf

##contig= ID=chr5,length=180915260 
##contig= ID=chr6,length=171115067 
##contig= ID=chr7,length=159138663 
##contig= ID=chr8,length=146364022 
##contig= ID=chr9,length=141213431 
##contig= ID=chr10,length=135534747 

我想添加额外的col作为最后一个col,例如,新文件a_a.vcfa_a.vcf

##contig= ID=chr1,length=249250621  a.vcf
##contig= ID=chr2,length=243199373  a.vcf
##contig= ID=chr3,length=198022430  a.vcf
##contig= ID=chr4,length=191154276  a.vcf

对于单个vcf文件,我使用了以下代码:

awk 'NR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' a.vcf

然后我想把这个应用到这个文件夹中的所有文件。

for d in *.vcf; do
awk 'NR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' a_$d
done

但是我发现-zsh取代了$0,我怎么解决这个问题?

awk 'NR == 1 {print -zsh  name_file; next;}{print -zsh   FILENAME;}' a_a.vcf 
awk 'NR == 1 {print -zsh  name_file; next;}{print -zsh   FILENAME;}' a_b.vcf 
awk 'NR == 1 {print -zsh  name_file; next;}{print -zsh   FILENAME;}' a_c.vcf 

GNUAWK不限于单个输入文件,您可以通过使用空格剪切的文件名向单个awk提供多个文件,在您的情况下尝试

awk 'FNR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' a.vcf b.vcf c.vcf

的输出应该与

相同
awk 'NR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' a.vcf
awk 'NR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' b.vcf
awk 'NR == 1 {print $0 " name_file"; next;}{print $0 " " FILENAME;}' c.vcf

请注意,我使用FNR代替NR,即文件内的行数,而不是(全局)行数。正如注释中建议的那样,您可以进一步改进利用OFS变量的代码,如下所示

awk 'BEGIN{OFS=" "}FNR == 1 {print $0, "name_file"; next}{print $0, FILENAME}' a.vcf b.vcf c.vcf

如果你想了解更多关于OFS和其他阅读8强大的Awk内置变量- FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

相关内容

最新更新