如何组合多个文本文件,删除重复的行并将剩余的行拆分为多个具有一定长度的文件?

时间:2017-04-26 08:26:41

标签: list split duplicates notepad++ bigdata

我有很多相对较小的文件,大约有350.000行文本。 例如:

文件1:

 asdf
 wetwert
 ddghr
 vbnd
 ...
 sdfre

文件2:

 erye
 yren
 asdf
 jkdt
 ...
 uory

如您所见,文件2的第3行是文件1中第1行的副本。 我想要一个程序/ Notepad ++插件,可以在多个文件中检查和删除这些重复项。

我遇到的下一个问题是我希望将所有列表合并到大的1.000.000行文件中。 所以,例如,我有这些文件:

  • 648563行
  • 375924行
  • 487036行

我希望他们产生这些文件:

  • 1.000.000行
  • 511.523行

最后两个文件必须只包含唯一的行。 我怎么可能这样做?我可以使用一些程序吗?或者多个Notepad ++插件的组合? 我知道GSplit可以将1.536.243的文件分成1.000.000和536.243行的文件,但这还不够,而且它不会删除重复项。

如果需要,我确实想创建自己的Notepad ++插件或程序,但我不知道如何以及从何处开始。

提前致谢。

1 个答案:

答案 0 :(得分:1)

你问过Notepad ++,因此使用的是Windows。另一方面,你说如果需要你想创建一个程序,所以我想主要的目标是完成工作。
这个答案使用Unix工具 - 在Windows上,你可以使用Cygwin

要运行命令,您必须在终端/控制台中键入(或粘贴)它们。

cat file1 file2 file3 | sort -u | split -l1000000 - outfile_

cat读取文件并回复它们;通常,在屏幕上,但是管道|获取留给它的命令的输出并将其传递给右边的命令。

sort显然对它们进行排序,并且切换-u告诉它删除重复的行。

然后将输出传送到split,这被告知在开关-l1000000之后在1000000行之后分割。 -(周围有空格)告诉它不是从文件中读取输入,而是从"标准输入&#34 ;;在这种情况下,sort -u中的输出。如果你愿意,最后一个单词outfile_可以由你改变。

写得像,这会产生outfile_aaoutfile_ab之类的文件等等 - 您可以使用此命令中的最后一个单词对其进行修改。

如果您拥有目录中的所有文件,并且没有其他文件,则可以使用*而不是列出所有文件:

cat * | sort -u | split -l1000000 - outfile_

如果文件可能包含空行,则可能需要删除它们。否则,它们将被排序到顶部,而您的第一个文件将没有完整的1.000.000值:

cat file1 file2 file3 | grep -v '^\s*$' | sort -u | split -l1000000 - outfile_

这也将删除仅由空格组成的行。 grep使用正则表达式过滤输入。 -v反转过滤器;通常,grep只保留匹配的行。现在,它只保留不匹配的行。 ^\s*$匹配除了0或更多空格字符(如空格或制表符)以外的所有行。

如果您需要定期执行此操作,您可以编写脚本,这样您就不必记住详细信息:

#!/bin/sh
cat * | sort -u | split -l1000000 - outfile_

将其另存为文件(例如combine.sh)并使用

运行
./combine.sh