如何提高 awk 的计算速度

deasty
有一个 50M 的文本,90 多万行,每行有个数字,用 shell 写个脚本用 awk 取数后经过一个幂运算再输出到新文本,7 个小时过去了,才完成 20 多万行,如何能提高这个效率?
26 条回复  •  2020-06-18 19:13:42 +08:00
amoia50
amoia5011 小时 33 分钟前 via iPhone
python 不香吗[狗头]
1
iintothewind
iintothewind11 小时 26 分钟前
xargs, parallel 都可以并行处理 可以试试
2
rrfeng
rrfeng11 小时 24 分钟前 via Android
每行只有一个数字?没别的?
运算具体是啥?

你这相当于没说,咋分析
3
delectate
delectate11 小时 24 分钟前
7 小时大约 25200s,处理 20w 行,一秒 10 行,不够快。
要么 py+多进程,要么像楼上说的并行处理,或者干脆把文件拆分,然后多个一起跑也行。
4
FrankHB
FrankHB11 小时 17 分钟前
为什么非要制造瓶颈?这种简单任务你用 C 临时糊个都不用几分钟,省下几个小时不香吗……
5
lululau
lululau11 小时 17 分钟前 via iPhone
单行命令的文本处理,python 真不香,sed awk perl ruby 不知道香到哪里去了,你也配叫脚本语言
6
CEBBCAT
CEBBCAT11 小时 6 分钟前 via Android
上次可能是计算 int64 的移位,awk 确实没有 Python 快,我跑起来一会儿 awk 了发现还没跑好,然后再开了一个终端去写 Python,等我写完跑出结果了 awk 还是没有算完。

楼上这么说有什么依据吗?
7
momocraft
momocraft10 小时 41 分钟前
"经过一个幂运算" 是 awk 自己的计算吗?
8
layorlayor
layorlayor10 小时 40 分钟前
把代码贴出来吧。感觉不应该这么慢
9
lululau
lululau10 小时 39 分钟前
@CEBBCAT 举两个最简单也最常见的例子:

文本替换:

sed 's///'
gawk 'gsub()'
perl -pe 's///'
ruby -pe 'gsub!()'

取一列并做变换:

gawk '{print $1*2}'
perl -alne 'print $F[0]*2'
ruby -ane 'puts $F[0].to_i * 2'

欢迎楼下用 python 弄一个更简单的写法来打脸

还忘了说最近看到的一个行列结构文本处理的瑞士军刀 miller
10
ylrshui
ylrshui10 小时 21 分钟前 via iPhone
估计 excel 都比这快
11
thedog
thedog10 小时 1 分钟前
awk 不应该那么慢吧,很多时候,这种简单任务,awk 比 python 快的。
12
runze
runze9 小时 54 分钟前
代码贴出来看看? awk 虽然不算快,但绝不至于慢到这种程度
13
TimePPT
TimePPT9 小时 50 分钟前 via Android
这么规整的结构,还要做计算。pandas 很香的
14
ygtq
ygtq9 小时 46 分钟前
show me the code :)
15
xlcoder166
xlcoder1669 小时 45 分钟前
现有代码不变的思路 - 分治

1. 拆原文件至 90W / n ( CPU 核心数)个文件
2. shell 并行处理 拆分的文件
16
youngster
youngster9 小时 35 分钟前
估计不是 awk 慢,是你运算太慢,换个换个运算快的语言应该都能解决
17
layorlayor
layorlayor9 小时 33 分钟前
awk -F'|' '{print $2*1024*1024"|"$0}' 这个很快呀
18
layorlayor
layorlayor9 小时 28 分钟前
awk -F'|' '{print $2*1024*1024"|"$0} input.txt > output.txt
19
Vegetable
Vegetable9 小时 26 分钟前
你这脚本写的是个啥,处理单行文本还有 for 循环?看着就害怕
20
Vegetable
Vegetable9 小时 22 分钟前
btw,1024*1024 就是 2**20
21
klesh
klesh9 小时 10 分钟前
测试命令:
seq 0 10000 | awk '{print "foo|"$1"|bar"}' > test.txt
time awk -F'|' '{print $2*1024*1024"|"$0}' test.txt

结果:
10484711424|foo|9999|bar
10485760000|foo|10000|bar

________________________________________________________
Executed in 76.44 millis fish external
usr time 54.70 millis 0.00 micros 54.70 millis
sys time 21.51 millis 962.00 micros 20.54 millis


硬件
CPU: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
SSD: SanDisk SD8SB8U5
22
Kelan
Kelan8 小时 34 分钟前
这么小的文本跑 7 个小时有点离谱了把。
23
0x11901
0x119013 小时 39 分钟前
说实话每次遇到这种问题总有一群人说用 python 不香么……

真是应了那句老话:当你手上有一把锤子的时候,看所有的东西都是钉子
24
freelancher
freelancher1 小时 51 分钟前
结果是个啥。得说呀。还是说附言二就解决了?
25
Semidio
Semidio1 小时 18 分钟前
@freelancher #24 注意看 18L 和附言 2 的区别
26