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

Jos*_*osh 4 awk text-processing

我正在尝试比较两个文件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   
Run Code Online (Sandbox Code Playgroud)

文件2:

MSTRG.1.1       ALLMI        
MSTRG.3.1       COTJA   
MSTRG.4.1       SORCY 
Run Code Online (Sandbox Code Playgroud)

我一直在使用以下命令:

$ awk -F '\t' 'BEGIN{OFS=FS} NR==FNR {a[$1]=$1; next} $3 in a {print $1}' File2 File1
Run Code Online (Sandbox Code Playgroud)

我希望输出是:

a ALLMI
c COTJA
d SORCY,
Run Code Online (Sandbox Code Playgroud)

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

a    
c    
d
Run Code Online (Sandbox Code Playgroud)

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

ste*_*eve 9

awk 解决方案

这个怎么样。不给你提供确切的输出,但我不确定为什么d SORCY,会打印,因为dMSTRG3.1,这是COTJA

无论如何,这就去。首发十人。在 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
$
Run Code Online (Sandbox Code Playgroud)

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

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

“打高尔夫球”的awk解决方案

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

awk 'NR==FNR{a[$1]=$2}a[$3]{print$1,a[$3]}' file{2,1}
Run Code Online (Sandbox Code Playgroud)

加入解决方案

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

$ join -1 3 -2 1 -o "1.1 2.2" file1 file2
a ALLMI
d COTJA
$
Run Code Online (Sandbox Code Playgroud)

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