> 4 GB のファイル myfile.gz が与えられた場合、Teradata の fastload で使用できるようにパイプに zcat する必要があります。ファイル内の行数もカウントする必要があります。理想的には、ファイルを 1 回だけ通過させたいと考えています。awk を使用して行全体 ($0) を stdout に出力し、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 をより有効に活用できるかどうかを知りたいです。私は他の方法にもオープンです。この方法で処理する必要がある大きなファイルが複数あります。