【发布时间】:2016-04-21 17:25:30
【问题描述】:
假设我有一个 10GB 的文件,其中有 20,000 行填充了 pi 的数字。
- 123123
- 12312312
- 123123
- 123123
- 12312312
- 123123
如何使用 unix 命令sed -n 提取第 10,000 到 20,000 行?
我希望使用下面的代码将带有换行符的每一行导出到文件中。
到目前为止,我有以下内容:
com = "sed -n \' " + str(window[0]) + "," + str(window[1]) + "p\' " + "sample.txt" + ">" + "output.txt"
os.system(com)
但它会引发连接错误。
我应该如何在下面的程序中为 Python 编写命令 sed -n?
inputFileName = "sample.txt"
import itertools
import linecache
def sliding_window(window_size, step_size, last_window_start):
for i in xrange(0, last_window_start, step_size):
yield (i, i + window_size)
yield (last_window_start, total_pi_digits)
def PiCrop(window_size, step_size):
f = open(inputFileName, 'r')
first_line = f.readline().split()
total_pi_digits = int(first_line[0])
last_window_start = total_pi_digits-(total_pi_digits%window_size)
lastcounter = (total_pi_digits//window_size)*(window_size/step_size)
flags = [False for i in range(lastcounter)]
first_line[0] = str(window_size)
second_line = f.readline().split()
offset = int(round(float(second_line[0].strip('\n'))))
first_line = " ".join(first_line)
f. close()
with open(inputFileName, 'r') as f:
header = f.readline()
for counter, window in enumerate(sliding_window(window_size,step_size,last_window_start)):
with open('PiCrop_{}.txt'.format(counter), 'w') as output:
if (flags[counter] == False):
flags[counter] = True
headerline = float(linecache.getline(inputFileName, window[1]+1)) - offset
output.write(str(window_size) + " " + str("{0:.4f}".format(headerline)) + " " + 'L' + '\n')
com = "sed -n \' " + str(window[0]) + "," + str(window[1]) + "p\' " + "sample.txt" + ">" + "output.txt"
os.system(com)
PiCrop(1000,500)
【问题讨论】:
-
创建一个运行
sed -n '/3.12[0-9]*/p' file |head -20000 > pifile的shell脚本,然后用pifile作为参数调用你的python处理?祝你好运。 -
当你写
using sed -n but in Python时,是不是有一个小小的警钟响起,也许有更好的方法?
标签: python regex bash sed iterator