我有很多相对较小的文件,大约有350.000行文本。 例如:
文件1:
asdf
wetwert
ddghr
vbnd
...
sdfre
文件2:
erye
yren
asdf
jkdt
...
uory
如您所见,文件2的第3行是文件1中第1行的副本。 我想要一个程序/ Notepad ++插件,可以在多个文件中检查和删除这些重复项。
我遇到的下一个问题是我希望将所有列表合并到大的1.000.000行文件中。 所以,例如,我有这些文件:
我希望他们产生这些文件:
最后两个文件必须只包含唯一的行。 我怎么可能这样做?我可以使用一些程序吗?或者多个Notepad ++插件的组合? 我知道GSplit可以将1.536.243的文件分成1.000.000和536.243行的文件,但这还不够,而且它不会删除重复项。
如果需要,我确实想创建自己的Notepad ++插件或程序,但我不知道如何以及从何处开始。
提前致谢。
答案 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_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