在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:同时使用排序和Uniq命令
另一种计算文本文件中重复行数的方法是同时使用排序和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 '{ 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 “文件中寻找这些行。
然后我们可以使用带有”-l “标志的wc命令来计算行数–
$ 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用户的生产力和效率。