整理制表符分隔的文件

BSP*_*BSP 3 text-processing join

我想比较映射文件中的信息,以便以制表符分隔的文件格式检索交联信息。

例如,一个文件包含

COG0001 882.DVU3168
COG0002 883.DvMF_2502
COG0001 1140.Synpcc7942_0645
COG0001 1148.SYNGTS_2220
Run Code Online (Sandbox Code Playgroud)

另一个文件

COG0001 H
COG0002 E
Run Code Online (Sandbox Code Playgroud)

最终文件应包含以下信息:

COG0001 882.DVU3168 H
COG0002 883.DvMF_2502   E
COG0001 1140.Synpcc7942_0645    H
COG0001 1148.SYNGTS_2220    H
Run Code Online (Sandbox Code Playgroud)

编辑

回到我的问题,我还想将信息从文件 2 打印到文件 3。

我的命令是:

awk -F $'\t' 'FNR==NR{a[$2]++;next}a[$1]''{print $0, ..... }' file2 file1 > file3
Run Code Online (Sandbox Code Playgroud)

这将根据匹配第 2 列(file2)到第 1 列(file1)的内容为我提供从 file1 的所有内容。

如何设置以便我也可以打印文件 2 中的信息?

use*_*001 6

使用 awk,您可以这样做:

$ awk 'NR==FNR{a[$1]=$2;next}{print $0, a[$1]}' file2 file1
COG0001 882.DVU3168 H
COG0002 883.DvMF_2502 E
COG0001 1140.Synpcc7942_0645 H
COG0001 1148.SYNGTS_2220 H
Run Code Online (Sandbox Code Playgroud)

NR==FNR{a[$1]=$2;next}块为 file2 运行,并将第二个字段存储在映射中,使用第一个字段作为键。

{print $0, a[$1]}块为 file1 运行,它打印当前行,然后是从映射中检索到的值。

如果您希望数据以制表符分隔(其他空格不分隔字段),您可以运行awk -F'\t' ...,如果您还希望输出制表符分隔,请使用awk -F'\t' -v OFS='\t' ....