Linux-一种更有效的方法来计算文件中的价格值

时间:2019-12-04 05:48:07

标签: linux performance awk decimal processing-efficiency

我有一个相当大的文件(超过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 <​​/ strong>

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

1 个答案:

答案 0 :(得分:1)

您可以根据OP的尝试和评论尝试以下内容。

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