【发布时间】:2018-08-25 18:56:24
【问题描述】:
我有一个文件example.txt,大约有 3000 行,每行都有一个字符串。一个小文件的例子是:
>cat example.txt
saudifh
sometestPOIFJEJ
sometextASLKJND
saudifh
sometextASLKJND
IHFEW
foo
bar
我想检查这个文件中所有重复的行并输出它们。期望的输出是:
>checkRepetitions.sh
found two equal lines: index1=1 , index2=4 , value=saudifh
found two equal lines: index1=3 , index2=5 , value=sometextASLKJND
我做了一个脚本checkRepetions.sh:
#!bin/bash
size=$(cat example.txt | wc -l)
for i in $(seq 1 $size); do
i_next=$((i+1))
line1=$(cat example.txt | head -n$i | tail -n1)
for j in $(seq $i_next $size); do
line2=$(cat example.txt | head -n$j | tail -n1)
if [ "$line1" = "$line2" ]; then
echo "found two equal lines: index1=$i , index2=$j , value=$line1"
fi
done
done
但是这个脚本很慢,运行需要10多分钟。在 python 中,它需要不到 5 秒...我尝试通过执行 lines=$(cat example.txt) 和执行 line1=$(cat $lines | cut -d',' -f$i) 将文件存储在内存中,但这仍然很慢...
【问题讨论】:
-
@EdMorton 我编辑了它,我想现在很清楚了
-
听起来你应该看看 sort 和 uniq 命令。
-
@EdMorton 我想要一个高效的解决方案,如果文件有十行,我可以用我的代码轻松完成,但可以编辑它。
-
@Pedro, ...如果您想要一个最有效的解决方案,bash 是不适合这项工作的工具。尽管所有的命令替换,外部命令调用,&c。使你的代码比它可能的效率低许多 base-10 数量级(也就是说,是的,数百或数千倍) - 如果你不是,一个 BashFAQ #1
while read循环通常是正确的事情对性能非常敏感,因此完全优选使用不同的语言。
标签: linux bash shell scripting