“wc -l”处理我的文件需要很长时间,是否有更快的替代方案?

“wc -l”处理我的文件需要很长时间,是否有更快的替代方案?

我需要帮助编写脚本来输出多个大文件中每个文件的行数。wc -l需要很长时间,所以我希望使用awk命令来显示所有匹配文件的最后行号abd*2020-09-21*

  • ls -l abd*2020-09-21*显示 22 个长(大)文件
  • 我需要找到wc -l每个文件的结果。
  • 目前我正在使用
    wc -l abd*2020-09-21.txt > CCNC_UNIX_COUNTS.txt
    
    但这非常耗时。我需要帮助来改进它。

我试过

sed -n '$='

现在我需要它在所有文件 matchinv 中循环工作abd*2020-09-21.txt并将结果输出到文件CCNC_UNIX_COUNTS

答案1

文本文件只是字节流,没有索引,没有元数据,只是背靠背的行,每行后面都有一个换行符。除了完整读取文件之外,没有其他方法可以计算行数。wc -l可以有效地做到这一点,因为它不需要做任何其他事情,只需批量扫描读取换行字节即可。另一方面,awk许多其他工具也需要查看内容行,例如执行字段分割,它们必须解释并执行您给它们运行的​​代码。任何脚本语言都不可能比wc -l这里更快。

另一方面,如果缺少元数据通常是一个问题,那么使用其他文件格式(例如 SQLite 数据库)可能是一种选择。这当然会妨碍使用通常的文本处理工具来处理数据,但可能会使随机访问变得更容易。或者,如果您可以修改数据路径以保留所有行恒定长度,随机访问和计算行数是微不足道的(但不能在中间插入或删除行)。

答案2

如果计数不需要精确,那么您可以通过从文件末尾取样、查找平均值并根据通过非常快速的统计获得的文件的字节长度计算行数来估计长度称呼。

例如,我在 /tmp 中有一个 100 MB 的文件。使用:

time wc -l /tmp/100-mb.txt

产量:

1777700 /tmp/100-mb.txt
real    0m0.075s

使用 Perl 代码进行估计:

time ./esmele /tmp/100-mb.txt

产量:

1763385
real    0m0.012s

准确率超过 99%,速度提高 6 倍。 C 或类似代码可能会更快,因为将省略 perl 的翻译。

在系统上运行:

OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
perl 5.20.2

最美好的祝愿...干杯,drl

答案3

根据您的硬件,您可以尝试以下操作:

expr-fi/fastlwc: SIMD 增强字计数器 - GitHub

还有一个多线程版本。

我没有费心用一个大文件来测试它,但它可以工作并且它快速地。

自述文件中解释了通过 SIMD 进行字计数的算法。这是基本思想:

Just a sample (multiple   spaces).
1111010111111011111111100011111111             =[1]
0111101011111101111111110001111111 SHIFT [1]   =[2]
1000010100000010000000001110000000 NOT [2]     =[3]
1000010100000010000000000010000000 [1] AND [3]

fastwc计算字和行,但不计算多字节字符。

相关内容