【问题标题】:Linux - more efficient way to calculate price values within a fileLinux - 在文件中计算价格值的更有效方法
【发布时间】:2020-03-28 21:06:12
【问题描述】:

我有一个相当大的文件(超过 500,000 行,每行大约 2000 个字符),我需要对其进行解析并汇总特定字段中的值。

我目前正在使用以下,但运行大约需要 20 分钟:

grep ^D $INPUTFILE | cut -c 374-383 | paste -sd+|bc -l

关于我的文件的更多信息: - 这是一个管道分隔的文件 - 这些值可能包含十进制值

我正在使用 RHEL。 (任何人对更有效的方法有任何想法)

示例行:(其中之一)

D|||W239337273 ||||APPLE ||ORANGES |||||||||||||||||||||00172572880|||||||||||
| | | | | |||||||||||||||||||||| |||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||| 0.89| 1.95|| 1.95|||||||||||||||||||||| 0 .00||1 ||| 0.00||||||
|| 2.33|| 145.32|||||||| 0.83|||||||||||| 2.78| 37.99|||||||||||||||||||||||||
||||||||||||RAVINDERSINGH13 ||DAVID RANKIN | |19230129|01 |||STACK||2|||
|OVERFLOW ||||||||||||2076671331|046403139|1| |00||004336|||||||||||| ||||
|FISH |||||||2007878|||||COCONUTS |||CRK 0047 |||||||193264243231187998 ||||||
||30 ||| ||20191122||||1258338132 |C|||N||||||||||||||1 |||||||||6326812132 ||
|||0 | |0|||B2|||||||| |20191122|||||||||||BS1ACG962 |||THOR |CAPTAIN AMERICA
|||AVENGERS||1306885298 |||||||||||||||||||||||| |||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||

抱歉,上面的示例出于安全考虑已被修改,我的列值被错误地更改了。为了基于下面的 cmets 进行测试,我创建了一个包含 5 个条目的示例文件(上面示例行的副本)并成功运行了以下 2 个命令。将尝试为完整文件运行它以检查性能。

sh-4.2$ awk -F'|' '/^D/{sum += $166} END {print sum}' sample.txt

11.65

sh-4.2$ grep ^D sample.txt |切-c407-416 |粘贴 -sd+|bc -l

11.65

sh-4.2$ grep ^D full_file.txt | cut -c 374-383 | paste -sd+|bc -l
2316826.10

sh-4.2$ awk -F'|' '/^D/{sum += $153} END {print sum}' full_file.txt
2.31683e+06

我仔细检查了这些字段以确保我在两个命令中使用了相同的字段:

sh-4.2$ cut -c 374-383 full_file.txt > test1

sh-4.2$ awk -F'|' '{print $153}' full_file.txt > test2

sh-4.2$ diff test1 test2

【问题讨论】:

  • awk3-subshells2-pipes 所需的分钟相比,他们会在几秒钟内完成。如果您显示文件的前几个字段(我怀疑类似于DRUGS|bla|blah|....)并确定-c 374-383 代表的字段,它应该是微不足道的。 (更好 - 如果你有一个链接到你的输入文件发布)
  • 用实际的基于 1 的 Field-Number 替换 'N' 以求和:awk -F'|' '/^D/{sum += $N} END {print "sum ", sum}' $INPUTFILE(根据您的描述,我最好猜测
  • 我是第二个大卫先生,请在您的问题中添加您的 Input_file 示例和预期输出,然后让我们知道。
  • 如果发布一些示例输入并识别字段编号,我敢打赌@RavinderSingh13 可以在不到 60 秒的时间内快速生成并发布一个有效的答案,从而将您的运行时间减少 95%...
  • Chuckling..... 这些是不同数字格式的相同数字:)。有关如何在不使用默认 e+06 格式的情况下输出它的信息,请参阅 @RavinderSingh13 答案。 (您只需将小数点向右移动 6 位即可摆脱 e+06)。运行时有多好:)

标签: linux performance awk decimal processing-efficiency


【解决方案1】:

根据 OP 的尝试和 cmets,您能否尝试以下操作。

awk 'BEGIN{FS="|"}/^D/{sum+=$166} END{printf("%6.2f\n",sum)}'  Input_file

【讨论】:

  • awk 'BEGIN{FS="|"}/^D/{sum+=$153} END{printf("%6.0f\n",sum)}' iInput_file 2316826
  • 该输出有效,只是它似乎只提供整数作为输出并去掉小数点后的任何内容。
  • Do awk 'BEGIN{FS="|"}/^D/{sum+=$153} END{printf("%10.2f\n",sum)}' Input_file 所有的精度都在那里,你只需要告诉它以你喜欢的任何格式输出? awk 计算速度快多少?
  • 大约 1/4 的时间(因为你只有 1 个进程而不是 4 个:)
  • 不客气。好答案。你很快就会赶上 Ed 和 Charles :)(好吧,也许不会很快,我需要几年时间才能爬到那个水平......)
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2014-12-17
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
相关资源
最近更新 更多