linux - 如何有效地循环遍历 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)
但这仍然很慢......
解决方案
当你不想使用时awk
(一个很好的工作工具,只解析一次输入),你可以通过几行运行。排序很昂贵,但这种解决方案避免了您尝试过的循环。
grep -Fnxf <(uniq -d <(sort example.txt)) example.txt
与uniq -d <(sort example.txt)
您一起找到不止一次出现的所有行。接下来grep
将搜索这些(选项-f
)完整(-x
)不带正则表达式(-F
)的行并显示它出现的行(-n
)。
推荐阅读
- vim - 我可以在 CGDB 中映射 SHIFT+F11 Visual Studio 调试器快捷方式吗?
- python - 以编程方式更改监视器输入源
- django - 无法将用户分配给更改模型对象的模型对象
- amazon-web-services - 如何将数组存储到 dynamoDB 表中
- r - R GLM:修改现有 glm 模型的系数
- c - 当给出的唯一信息是后序遍历时,如何构造严格的二叉树?
- mysql - 为什么我得到错误 updated_at cannot be null activerecord rails 5.2 mysql 5.7?
- r - 使用crossing和sample_n对多个不同的样本大小进行采样以创建单个df
- java - 将字符串存储到带有出现的哈希图中
- javascript - 如何使用 lodash 将两个数组(数组 1d 和数组 2d 对象)合并为一个数组