首页 > 解决方案 > 如何合并 2 个文件,其中 1 个文件具有来自另一个文件的子字符串并打印第一个匹配项的整行

问题描述

我有 2 个文件,第一个文件包含来自第二个文件的子字符串,如下所示:

file1.txt                       file2.txt
---------                       ---------
foo                             bla bla bla
te                              foo foo
bla                             some
                                test
                                foo foo
                                bla bla bla

我正在寻找下一个结果:

result.txt
----------
foo foo
test
bla bla bla

它应该是文件 1 的顺序和文件 2 的整行,没有重复

在文件 1 中没有重复

我尝试了下一个脚本:

while IFS= read -r line; do
grep "$line" file2.txt | head -1 >> result.txt                               
done < file1.txt

但它卡住并且效果不佳

我正在寻找有很多行的文件。

如果有人知道,我不在乎将其更改为其他命令,例如 awk 或 sed。

我相信有一种更快的方法可以做到这一点

感谢你的帮助

标签: bash

解决方案


假设您使用的是 GNU grep,请尝试

while IFS= read -r line; do
    grep -F -m1 "$line" file2.txt                          
done < file1.txt > result.txt

-m N告诉 (GNU) grep 在 N 个匹配行之后停止,因此您不需要head. 并且将输出重定向移到循环之外更有效。


推荐阅读