Python 如何从日志文件中的不同行提取字段,并将结果合并到单个输出中?
我正在尝试实现一个脚本,该脚本自动读取下一代测序数据分析运行的日志文件,并在分析的每个步骤后报告读取计数。日志文件的格式始终相同 例如,包含samples进程的行以“willparse”开头,示例名称位于第四列(字段)。类似地,包含输出读取的行以“修剪输出”开始,输出读取的数量在这些行的第三列(字段)中。我已经使用grep命令来提取样本名称和两个新文件的读取次数。对于提取文件名:“grep”将“PCOL.5_2016-11-03_090036694.log | cut-d”'-f4>file1”。用于提取每一步后输出的读取数:“grep”修剪输出:“PCOL.5_2016-11-03_090036694.log | cut-d”“-f 3,6>file2” 现在,我想将file1中样本的名称与file2输出的读取次数合并。file1中的第1行对应于file2中的第1行,file1中的第2行对应于file2中的第2行,依此类推。换句话说,对于文件1的第一行中的样本#1,输出的读取数在文件2的第一行中,对于文件1的第二行中的样本#2,输出的读取数在文件2的第二行中,以此类推。然后,脚本应输出如下内容:Python 如何从日志文件中的不同行提取字段,并将结果合并到单个输出中?,python,shell,Python,Shell,我正在尝试实现一个脚本,该脚本自动读取下一代测序数据分析运行的日志文件,并在分析的每个步骤后报告读取计数。日志文件的格式始终相同 例如,包含samples进程的行以“willparse”开头,示例名称位于第四列(字段)。类似地,包含输出读取的行以“修剪输出”开始,输出读取的数量在这些行的第三列(字段)中。我已经使用grep命令来提取样本名称和两个新文件的读取次数。对于提取文件名:“grep”将“PCOL.5_2016-11-03_090036694.log | cut-d”'-f4>file1”
sample #1 reads_1
sample #2 reads_2
samples = pd.read_csv(sample_filename, sep=separator_character)
reads = pd.read_csv(reads_filename, sep=separator_character)
output = samples.join(reads)
output.to_csv(output_filename, index=False, sep='\t')
直到返回所有样本的所有读取输出。我的问题是,什么是最好的方法?在这里,速度不是一个必要的考虑因素,因为所讨论的日志文件不是很大——通常少于1000行。我很晚才开始编程。shell及其最基本的命令(“grep”、“cat”、“ls”、“mkdir”、“head”、“tail”等)我很熟悉,我一直在努力学习更多。是否有一些shell命令或正则表达式可用于过滤日志文件中的数据并获得所需的结果?还是最好尝试使用R或Python来实现这一点?例如,如果我将使用grep命令获得的两个文件读入Python,然后使用类似以下的例程在Python中处理它们:
def main(file1,file2):
#put everything in try-catch
f1 = open(file1, 'r')
f2 = open(file2, 'r')
output = ""
while not EOFerror: #find the proper way to end file reading
output+=f1.readline()
output+="\t"
output+=f2.readline()
output+="\n"
print(output)
output=" "
f1.close()
f2.close()
return output
感谢您提供的指导,因此您可以在这种情况下完成此任务。事实上,您可以从一开始就使用它,也就是说,您在哪里使用
grep
。不过,如果您已经有了一个处理grep的流程,我会说坚持下去
假设文件以某种标准方式(逗号、制表符、“|”等)分隔,您可以轻松地将其读入,然后沿轴合并。举个例子:
sample #1 reads_1
sample #2 reads_2
samples = pd.read_csv(sample_filename, sep=separator_character)
reads = pd.read_csv(reads_filename, sep=separator_character)
output = samples.join(reads)
output.to_csv(output_filename, index=False, sep='\t')
由于两个数据集已经存在于两个单独的文件中,假设它们包含的行数相等,可以使用“粘贴”命令将它们合并在一起
paste file1 file2 > mergedoutput
根据我个人的经验,我逐渐认识到bash中的文本解析是有限的,更好的方法是使用类似Python(2.7)的语言。您可以使用其内置的字符串util方法split()、startswith()和一些条件语句实现相同的结果。请格式化所有内容