从文件中读取值并打印另一个文件中存在的那些行

从文件中读取值并打印另一个文件中存在的那些行

我有两个不同的文件:文件 1 有 100 万个条目,文件 2 有 130 万个条目。我的文件 1 看起来像这样

A  54 54 67 abcd
C 54 4 1.2 lmno
D 43 2 22.2 asdasd

File2 看起来类似

A 0 1.1 1 qr
D 2 1 1 rerlm

但是 file1 的条目比 file2 更多。并非所有第 1 列值都出现在 file2 中。所有其他列都不同。

我需要打印 file1 中与 file2 中第一列匹配的所有此类行。简而言之,根据第一个列条目是否存在于 file2 中,打印 file1 中的所有行并将其存储在 file3 中。

答案1

一个简单的解决方案是使用join命令来完成此操作。

这需要两个文件均已排序,因为join仅适用于这些情况...您可以使用sort如果文件未排序,则对文件进行排序。

它还假设第一个文件(您要打印的文件)中的字段数量是固定的,因为您需要逐个指定输出字段。

此解决方案还假设您可以更改解决方案中字段之间的空格。如果 file1 没有被排序,那么你可以接受最终结果的排序(并且不一定保留 file1 的顺序)。

因此,假设您可以接受这些限制,那么您需要做的就是:

$ join -o 1.1,1.2,1.3,1.4,1.5 file1 file2
A 54 54 67 abcd
D 43 2 22.2 asdasd

如果文件未排序,一个简单的方法是使用bash 进程替换对它们进行即时排序并将它们提供给join

$ join -o 1.1,1.2,1.3,1.4,1.5 <(sort file1) <(sort file2)

(尽管如果文件很大并且有数百万行,您可能需要存储排序结果,这样您就不必再次排序。)

需要注意的是,这取决于您的语言环境(定义排序顺序),如果您的文件中有该空格,您可能还想传递跳过前导空格的sort选项-b... 的手册页join还建议使用sort -k 1b,1并讨论LC_COLLATE使用控制排序和连接的顺序...希望这是解决这个问题的一个良好的开始!

相关内容