我有一个文件A,描述了如下所示的行顺序:
ddr_mode,8,#tc_reg
gasket_ratio,7,#tc_reg
txX_ropll_refsel_override,0,#tc_reg,4
mpllb_word_clk_en,0,#tc_reg
mplla_word_clk_en,1,#tc_reg
我有另一个文件B,我需要按照文件A定义的顺序从中提取行。文件B看起来像这样:
tc gen3_ddr_mode 8
tc gen3_ddr_mode 8
tc gen3_gasket_ratio 7
tc gen3_gasket_ratio 7
tc gen3_mplla_word_clk_en 1
tc gen3_mplla_word_clk_en 1
tc gen3_mpllb_word_clk_en 0
tc gen3_mpllb_word_clk_en 0
tc tx0_ropll_refsel_override 0
tc tx1_ropll_refsel_override 0
tc tx2_ropll_refsel_override 0
tc tx3_ropll_refsel_override 0
tc tx0_ropll_refsel_override 0
tc tx1_ropll_refsel_override 0
tc tx2_ropll_refsel_override 0
tc tx3_ropll_refsel_override 0
输出文件应如下所示:
tc gen3_ddr_mode 8
tc gen3_gasket_ratio 7
tc tx0_ropll_refsel_override 0
tc tx1_ropll_refsel_override 0
tc tx2_ropll_refsel_override 0
tc tx3_ropll_refsel_override 0
tc gen3_mpllb_word_clk_en 0
tc gen3_mplla_word_clk_en 1
tc gen3_ddr_mode 8
tc gen3_gasket_ratio 7
tc tx0_ropll_refsel_override 0
tc tx1_ropll_refsel_override 0
tc tx2_ropll_refsel_override 0
tc tx3_ropll_refsel_override 0
tc gen3_mpllb_word_clk_en 0
tc gen3_mplla_word_clk_en 1
请注意,文件A如何定义顺序以及如何从文件B中提取数据。另外,请注意txX_ropll_refsel_override,0,#tc_reg,4
被提取4次。最后的 4 表示应提取的次数。在Python中有更好的方法吗?
EDIT ===== 我尝试使用以下代码将文件A中的任何关键字与文件B匹配。
with open('file_a.txt', 'r') as k:
keywords = k.read().splitlines()
results = []
with open('file_b.txt') as f, open('output.txt', 'w') as o:
for line in f:
if any(key in line for key in keywords):
o.writelines(line)
但是我没有得到任何输出。当然,即使这可行,也无法解决重复提取的问题。
答案 0 :(得分:0)
以下几乎起作用,除了您的密钥似乎没有遵循稳定的模式。如果您可以解决此问题,其余的方法将起作用:
def do_sort(key_filename, data_filename, out_filename):
with open(key_filename) as key_file:
order = {line.partition(',')[0]: i for i, line in enumerate(key_file)}
with open(data_filename) as data_file:
data = sorted(data_file, key=lambda line: order[line.split()[1]])
with open(out_filename, 'w') as out_file:
for line in data:
print(line.rstrip('\n'), file=out_file)
if __name__ == '__main__':
do_sort('A.txt', 'B.txt', 'B-sorted.txt')