2017-04-26 11 views
1

我有很多相对较小的文件,大约有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行

而最后2个文件必须只包含唯一的行。 我该如何做到这一点?我可以为此使用一些程序吗?或者多个Notepad ++插件的组合? 我知道GSplit可以将1.536.243文件分割为1.000.000和536.243行的文件,但这还不够,并且不会删除重复项。

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

在此先感谢。

+0

行号实际上是文件的一部分吗?如果是,他们需要被忽略重复检查,对吧?他们需要保存在输出中吗?必须保留这些行的顺序吗? – Pharaoh

+0

@Pharaoh不是行号不是文件的一部分,行的顺序并不重要。 –

+0

你想删除所有重复或保留其中之一? – Toto

回答

1

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

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

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

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

sort显然将它们排序,并且开关-u告诉它删除重复的行。

然后输出到split,该信息被告知在交换机-l1000000的1000000行之后分裂。-(带有空格)告诉它不是从文件中读取它的输入,而是从“标准输入”中读取它的输入;在这种情况下输出在sort -u。如果你愿意,最后的话,outfile_,可以由你改变。

这样写就会产生像outfile_aa,outfile_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 
相关问题