учитывая файл myfile.gz размером> 4 Гб, мне нужно поместить его в канал для потребления быстрой загрузкой Teradata. Мне также нужно посчитать количество строк в файле. В идеале я хочу сделать только один проход через файл. Я использую awk для вывода всей строки ($ 0) в stdout и, используя предложение END в awk, записываю количество строк (переменную NR в awk) в другой файловый дескриптор (outfile).
Мне удалось сделать это с помощью awk, но я хотел бы знать, существует ли более питонический способ.
#!/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, которая читает из
"/dev/fd/" + str(zcat_proc.stdout.fileno())
Это работает, но я хотел бы знать, возможно ли пропустить awk и лучше использовать python. Я также открыт для других методов. У меня есть несколько больших файлов, которые мне нужно обработать таким образом.