Linux - 在文件中计算价格值的更有效方法
Linux - more efficient way to calculate price values within a file
我有一个相当大的文件(超过 500,000 行,每行大约 2000 个字符),我需要对其进行解析并汇总特定字段中的值。
我目前正在使用以下内容,但 运行:
大约需要 20 分钟
grep ^D $INPUTFILE | cut -c 374-383 | paste -sd+|bc -l
关于我的文件的更多信息:
- 这是一个竖线分隔的文件
- 值可能包含小数值
我正在使用 RHEL。 (任何人对更有效的方法有任何想法)
样本行:(许多中的 1)
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 |||||||||||||||||||||||| |||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||
抱歉,为了安全起见修改了上面的示例,我的列值被错误地更改了。出于基于以下评论的测试目的,我创建了一个包含 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 += 3} 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 3}' full_file.txt > test2
sh-4.2$ diff test1 test2
能否请您根据 OP 的尝试和评论尝试关注。
awk 'BEGIN{FS="|"}/^D/{sum+=6} END{printf("%6.2f\n",sum)}' Input_file
我有一个相当大的文件(超过 500,000 行,每行大约 2000 个字符),我需要对其进行解析并汇总特定字段中的值。
我目前正在使用以下内容,但 运行:
大约需要 20 分钟grep ^D $INPUTFILE | cut -c 374-383 | paste -sd+|bc -l
关于我的文件的更多信息: - 这是一个竖线分隔的文件 - 值可能包含小数值
我正在使用 RHEL。 (任何人对更有效的方法有任何想法)
样本行:(许多中的 1)
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 |||||||||||||||||||||||| |||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||
抱歉,为了安全起见修改了上面的示例,我的列值被错误地更改了。出于基于以下评论的测试目的,我创建了一个包含 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 += 3} 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 3}' full_file.txt > test2
sh-4.2$ diff test1 test2
能否请您根据 OP 的尝试和评论尝试关注。
awk 'BEGIN{FS="|"}/^D/{sum+=6} END{printf("%6.2f\n",sum)}' Input_file