我有两个不同的文件:文件 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
使用控制排序和连接的顺序...希望这是解决这个问题的一个良好的开始!