鉴于 > 4gb 文件 myfile.gz,我需要将其 zcat 到管道中以供 Teradata 的快速加载使用。我还需要计算文件中的行数。理想情况下,我只想对文件进行一次传递。我使用 awk 将整行($0)输出到标准输出,并通过使用 awk 的 END 子句,将行数(awk 的 NR 变量)写入另一个文件描述符(outfile)。
我已经设法使用 awk 做到了这一点,但我想知道是否存在更 Pythonic 的方式。
#!/usr/bin/env python
from subprocess import Popen, PIPE
from os import path
the_file = "/path/to/file/myfile.gz"
outfile = "/tmp/%s.count" % path.basename(the_file)
cmd = ["-c",'zcat %s | awk \'{print $0} END {print NR > "%s"} \' ' % (the_file, outfile)]
zcat_proc = Popen(cmd, stdout = PIPE, shell=True)
该管道随后被调用 teradata 的 fastload 消耗,该快速加载从
"/dev/fd/" + str(zcat_proc.stdout.fileno())
这可行,但我想知道是否可以跳过 awk 并更好地利用 python。我也对其他方法持开放态度。我有多个需要以这种方式处理的大文件。