我需要和awk脚本来比较两个文件标签分隔的第一列,每次有匹配时,我需要打印第二个文件,否则我需要第一个文件的所有行。
file1.txt
denovo0 bacteria 0.99
denovo1 bacteria 0.98
denovo2 bacteria;Firmicutes;clostridium 0.99
denovo3 bacteria;Firmicutes;bacillus 0.98 file2.txt
denovo0 bacteria;Gammaproteobacteria;pseudomonas 0.99
denovo1 bacteria;Alphaproteobacteria;Rhizobium 0.98desired_output.txt
denovo0 bacteria;Gammaproteobacteria;pseudomonas 0.99
denovo1 bacteria;Alphaproteobacteria;Rhizobium 0.98
denovo2 bacteria;Firmicutes;clostridium 0.99
denovo3 bacteria;Firmicutes;bacillus 0.98 发布于 2017-09-23 19:14:08
awk 'NR==FNR{a[$1]=$1;b[$1]=$0;next} $1==a[$1]{print $0 ;delete b[$1]}END{for (i in b ) print b[i]}' file1 file2解释
NR==FNR{a[$1]=$1;b[$1]=$0;next}:读取file1并分配带有第一列的数组a和以行为值的b。
$1==a[$1]{print $0 ;delete b[$1]}:检查a中的值是否与file2的第一列匹配,如果是,则打印file2行并从数组b中删除该行。
END{for (i in b ) print b[i]}:打印数组b中的剩余项,即file1的剩余行
发布于 2017-09-22 14:23:40
这个awk应该适用于您:
awk -v OFS='\t' 'NR==FNR{a[$1]=$2; next} $1 in a{$2=a[$1]} 1' file2 file1
denovo0 |bacteria;Gammaproteobacteria;pseudomonas| 0.99
denovo1 |bacteria;Alphaproteobacteria;Rhizobium| 0.98
denovo2 |bacteria;Firmicutes;clostridium| 0.99
denovo3 |bacteria;Firmicutes;bacillus| 0.98如果您想要一个表格输出,那么将其输送到column -t
awk -v OFS='\t' 'NR==FNR{a[$1]=$2; next} $1 in a{$2=a[$1]} 1' file2 file1 | column -t
denovo0 |bacteria;Gammaproteobacteria;pseudomonas| 0.99
denovo1 |bacteria;Alphaproteobacteria;Rhizobium| 0.98
denovo2 |bacteria;Firmicutes;clostridium| 0.99
denovo3 |bacteria;Firmicutes;bacillus| 0.98https://stackoverflow.com/questions/46366919
复制相似问题