我有一个很大的 txt 文件,其中的值重复了很多次。是否有一些我可以使用的命令可以通过文件,如果一个值出现一次就不再重复它?
SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
CL
Run Code Online (Sandbox Code Playgroud)
所以它应该看起来像这样:
S04
HOH
CL
BME
Run Code Online (Sandbox Code Playgroud)
问题是我有大量不同的值,所以不能像这里那样手动完成。
Joh*_*024 15
如果要使输出行与输入行的顺序相同,请使用:
$ awk '!a[$0]++' file
SO4
HOH
CL
BME
Run Code Online (Sandbox Code Playgroud)
这个怎么运作:
这使用关联数组a来计算每行先前被看到的次数。如果以前没有看到过,则打印该行。
pa4*_*080 11
您可以使用sort带有选项的命令--unique:
sort -u input-file
Run Code Online (Sandbox Code Playgroud)
如果要将结果写入 FILE 而不是标准输出,请使用选项--output=FILE:
sort -u input-file -o output-file
Run Code Online (Sandbox Code Playgroud)
uniq也可以应用该命令。在这种情况下,相同的线路必须是必然的,所以输入必须进行排序初步-感谢@RonJohn为这个笔记:
sort input-file | uniq > output-file
Run Code Online (Sandbox Code Playgroud)
我喜欢sort类似情况下的命令,因为它很简单,但是如果您使用大型数组awk,John1024 的答案中的方法可能会更强大。这是上述方法之间的时间比较,应用于具有近 500 万行的文件(基于上述示例):
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from ??s???'s answer
64
0.770
Run Code Online (Sandbox Code Playgroud)
sort -u只会在输入结束后打印结果,而此awk命令将即时打印每个新的结果行(这对于管道输入可能比文件更重要)。
这是一个插图:
在上面的示例中,循环(如下所示)生成字母 AD 的 500 个随机组合,每个组合的长度为三个字符。这些组合通过管道传送到awk或sort。
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
Run Code Online (Sandbox Code Playgroud)