首页 > 解决方案 > 如何有效地循环遍历 Bash 中的文件行?

问题描述

我有一个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秒......我试图通过dolines=$(cat example.txt)和do将文件存储在内存中,line1=$(cat $lines | cut -d',' -f$i)但这仍然很慢......

标签: linuxbashshellscripting

解决方案


当你不想使用时awk(一个很好的工作工具,只解析一次输入),你可以通过几行运行。排序很昂贵,但这种解决方案避免了您尝试过的循环。

grep -Fnxf <(uniq -d <(sort example.txt)) example.txt

uniq -d <(sort example.txt)您一起找到不止一次出现的所有行。接下来grep将搜索这些(选项-f)完整(-x)不带正则表达式(-F)的行并显示它出现的行(-n)。


推荐阅读