awk 比较两个文件



我需要和awk脚本来比较两个文件的第一列制表符分隔,每次有匹配时,我需要打印第二个文件,否则我需要第一个文件的所有行

文件1.txt

denovo0  bacteria   0.99  
denovo1  bacteria   0.98  
denovo2  bacteria;Firmicutes;clostridium    0.99  
denovo3  bacteria;Firmicutes;bacillus   0.98  

文件2.txt

denovo0  bacteria;Gammaproteobacteria;pseudomonas   0.99  
denovo1  bacteria;Alphaproteobacteria;Rhizobium     0.98

desired_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  
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中的剩余项目,即文件1的剩余行

这个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.98

相关内容

  • 没有找到相关文章

最新更新