根据第一列的匹配合并文件

根据第一列的匹配合并文件

我有两个文件:File1

ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423261 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423263 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305

文件2:

ARS-BFGL-BAC-10975 10 21225382
ARS-BFGL-BAC-11025 10 84516867
ARS-BFGL-BAC-11193 1 29303546

所需输出

ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546

因此文件 1 的行数比文件 2 多得多。我只想在输出中保留文件 2 中基于列 1 的行。

我尝试过加入,但无法让它正常工作 - 它会告诉我我的文件未排序

join -j 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,2.3 <(sort -k1 file1) <(sort -k1 file2)

最好我更喜欢 awk 命令。文件 1 将非常大。我努力了

awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > output

任何帮助将非常感激。谢谢

抱歉,我无法在下面发表评论,但只是为了澄清文件,并非文件 1 中第 1 列中的所有行都将在文件 2 中。

awk 命令

awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' 

只会保留文件 2 中的行数。但理想情况下,我想要的是例如 ARS-BFGL-10975 重复两次(实际上更多)以在我的输出中出现两次。

感谢你目前的帮助

答案1

使用您的示例数据:

$ join <(sort file1) <(sort file2)
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546

出现除了输出中行的顺序(此处已排序,我不知道这对您是否重要)之外,您还可以执行您希望它执行的操作。

默认连接字段是第一个字段,因此-j 1不需要(这是 GNUjoin扩展)。

默认输出join:“每个输出行由连接字段、file1 中的剩余字段以及 file2 中的剩余字段组成”(来自OpenBSD 手册)。这意味着您使用的输出字段规范也不是必需的,因为它与默认行为匹配。

对于sort,-k1同样相当于默认值。

除了意外使用 之外,我不知道是什么导致了您收到的错误消息sort -c

答案2

对于您的 awk 命令,您只是缺少检查 file1 中的密钥是否已在 file2 中看到

awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' file2 file1 > output
# ................................^^^^^^^

相关内容