我有大约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