使用 awk 比较文件并合并两个文件的输出?

使用 awk 比较文件并合并两个文件的输出?

我正在尝试使用比较两个文件awk,并且我想将两个文件中的数据打印为输出。我正在比较的文件如下。

文件1:

gene             feature id            fc         
a                gene                 MSTRG.1.1           
b                gene                 MSTRG.1.2   
c                gene                 MSTRG.2.1 
d                gene                 MSTRG.3.1   

文件2:

MSTRG.1.1       ALLMI        
MSTRG.3.1       COTJA   
MSTRG.4.1       SORCY 

我一直在使用以下命令:

$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1

我希望输出是:

a ALLMI
c COTJA
d SORCY,

但是,目前我只得到以下输出:

a    
c    
d

这两个文件都是制表符分隔的,所以我不确定为什么我的命令不起作用?

答案1

awk解决方案

这个怎么样。没有给出您提供的确切输出,但我不确定为什么, 会按原样d SORCY打印,即.dMSTRG3.1COTJA

不管怎样,就这样吧。十人首发。在 GNU Awk v4.0.2 上运行良好。

$ awk 'NR==FNR{a[$1]=$2}NR!=FNR&&FNR>1&&a[$3]{print $1,a[$3]}' file2 file1
a ALLMI
d COTJA
$

如果 NR 与 FNR 相同,则我们位于第一个文件,因此填充数组。

如果 NR 与 FNR 不同,则我们位于第二个文件,因此一旦我们越过了该文件的第一条记录(标头),并且如果数组中存在字段 3,则打印它。

“高尔夫球”awk 解决方案

可读性较差,但代码较短。

awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}

加入解决方案

或者,如果您不特别需要使用 来实现它awk,则只需使用join

$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$

-1 3使用文件 1 中的字段 3 ( ) 和文件 2 中的字段 1 ( )连接文件-2 1。然后从文件 1 中打印字段 1,从文件 2 中打印字段 2。答对了。

答案2

尝试这个,

 awk  'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1"\t"$3}'  file2 file1
  • 我们不需要\t作为分隔符。
  • 我们需要根据您的要求打印第一和第三字段。

答案3

你的代码,

awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1

永远无法输出两列,因为print最后只输出 的第一列File1

不过你已经快到了。您需要进行一项微小的调整,即实际输出缺失的字段:

awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $3, $1}' File2 File1
                                                                   ^^^
                                                                 add this

在您的数据上运行它应该会产生

MSTRG.1.1 a
MSTRG.3.1 d

对于大型数据集,请参阅史蒂夫的解决方案哪个内存效率更高。

相关内容