Cod*_*lue 25 search text-processing
是否有 unix 命令可以检查文件中的任何两行是否相同?
例如考虑一个文件 sentences.txt
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B
Run Code Online (Sandbox Code Playgroud)
我们看到这句话
This is sentence X
Run Code Online (Sandbox Code Playgroud)
重复。
是否有任何命令可以快速检测到这一点,以便我可以像这样执行它 -
$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X
Run Code Online (Sandbox Code Playgroud)
gre*_*eke 40
这是获得您正在寻找的确切输出的一种方法:
$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt
1:This is sentence X
4:This is sentence X
Run Code Online (Sandbox Code Playgroud)
解释:
内部$(sort sentences.txt | uniq -d)
列出了出现多次的每一行。外部grep -nFx
再次查找与这些行中的任何一行的sentences.txt
完全-x
匹配,-F
并在其行号前加上-n
aul*_*ron 10
不完全是你想要的,但你可以尝试结合sort
和uniq -c -d
:
aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B
aularon@aularon-laptop:~$ sort input | uniq -cd
2 This is sentence X
aularon@aularon-laptop:~$
Run Code Online (Sandbox Code Playgroud)
2
这是为该行找到的重复数,来自man uniq
:
-c, --count
prefix lines by the number of occurrences
-d, --repeated
only print duplicate lines
Run Code Online (Sandbox Code Playgroud)
如果文件内容适合内存awk
对此有好处。comp.lang.awk 中的标准单行(我无法从这台机器搜索一个实例,但每个月都有几个)来检测是否存在重复,awk 'n[$0]++'
它计算每行值的出现次数并打印任何出现次数除了第一个,因为默认操作是print $0
。
要以您的格式显示所有出现的事件,包括第一个,但在重复多个值时可能以混合顺序显示,变得更加挑剔:
awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
{print "Line "NR":"$0} '
Run Code Online (Sandbox Code Playgroud)
为清楚起见以多行显示,您通常在实际使用中一起运行。如果您经常这样做,您可以将awk
脚本放在一个带有 的文件中awk -f
,当然也可以将整个内容放在一个 shell 脚本中。和最简单的一样,awk
这可以用perl -n[a]
.