统计 Linux 文本文件中重复的行
引言
在 Linux 系统中,可能出于以下原因需要统计文本文件中重复行的数量:例如,您可能希望找出数据中是否存在任何错误,或者希望通过删除重复项来优化文件。无论出于何种原因,Linux 提供了多种可用于此目的工具和命令。
准备工作
在深入介绍这些命令之前,让我们先创建一个文本文件,其中包含一些重复行,我们可以使用这些重复行进行测试。打开一个终端,使用 touch 命令创建新文件:
$ touch "test.txt"
接下来,在您最喜欢的文本编辑器中打开该文件 (nano、vim 等),并添加以下行:
Hello World Hello Linux Linux
保存并关闭文件,但保持终端处于打开状态。
方法 1:使用 Uniq 命令
uniq 命令是一个实用工具,可以从文本文件中过滤掉重复的相邻行。它可以通过传递 “-c” 标志来统计重复行的数量,这将导致每行的前面加上它在输入中出现的次数。
要使用 uniq 统计 test.txt 文件中重复行的数量,我们可以使用以下命令:
$ uniq -c test.txt 2 Hello 1 World 2 Linux
如您所见,输出显示 “Hello” 行出现 两次,“World” 行出现 一次,“Linux” 行出现 两次。
方法 2:一起使用 Sort 和 Uniq 命令
计算文本文件中重复行的另一种方法是同时使用sort和uniq命令。sort命令对文本文件中的行进行排序,而uniq命令筛选出重复的相邻行。要使用这些命令计算重复行的数量,我们可以先使用sort命令对“test.txt”文件中的行进行排序
$ sort test.txt Hello Hello Linux Linux World
然后,我们可以使用带“-c”标志的uniq命令来计算重复行的数量 -
$ sort test.txt | uniq -c 2 Hello 2 Linux 1 World
正如你所看到的,输出显示“Hello”行出现两次,“Linux”行出现两次,“World”行出现一次。
方法3:使用Awk命令
awk命令是处理文本文件的强大工具。它可用于计算文本文件中重复行的数量,变量NR保存读取到现在为止的记录(行)的数量,显示数组保存已经看到的行的列表。
要使用awk计算重复行的数量,我们可以使用以下命令-
$ awk '{ if (seen[$0]++) { count++; } } END { print count }' test.txt 2
正如你所看到的,输出显示“test.txt”文件中2行重复。
方法4:使用Grep和wc命令
计算文本文件中重复行的另一种方法是同时使用grep和wc命令。grep命令查找匹配特定模式的行,而wc命令计算文件中的行、单词和字节的数量。要使用这些命令计算重复行的数量,我们可以先使用grep从“test.txt”文件中提取重复的行-
$ grep -w -f <(grep -w -o -e . test.txt | sort | uniq -d) test.txt Hello Linux
括号中的grep命令查找唯一行(-u标志)并只显示行的匹配部分(-o标志)。然后将输出传递给sort,对行进行排序,uniq “-d”,筛选出非重复行。然后将重复行的结果列表传递给外部grep命令,在“test.txt”文件中查找这些行。
然后我们可以使用wc命令和“-l”标志计算行的数量 -。
$ grep -w -f >(grep -w -o -e . test.txt | sort | uniq -d) test.txt | wc -l 2
正如你所看到的,输出显示“test.txt”文件中2行重复。
结论
在本文中,我们学习了如何使用uniq、sort、grep和awk命令在Linux系统上计算文本文件中重复行的数量。这些方法各有优缺点,你可以选择最适合自己需求的方法。无论选择哪种方法,重要的是要记住这些命令只是Linux上可用于处理文本文件的众多工具中的几个。还有许多其他命令和实用工具可用于处理和分析文本数据,学习如何有效地使用它们可以极大地提高你作为Linux用户的生产力和效率。