Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从日志文件中的不同行提取字段,并将结果合并到单个输出中?_Python_Shell - Fatal编程技术网

Python 如何从日志文件中的不同行提取字段,并将结果合并到单个输出中?

Python 如何从日志文件中的不同行提取字段,并将结果合并到单个输出中?,python,shell,Python,Shell,我正在尝试实现一个脚本,该脚本自动读取下一代测序数据分析运行的日志文件,并在分析的每个步骤后报告读取计数。日志文件的格式始终相同 例如,包含samples进程的行以“willparse”开头,示例名称位于第四列(字段)。类似地,包含输出读取的行以“修剪输出”开始,输出读取的数量在这些行的第三列(字段)中。我已经使用grep命令来提取样本名称和两个新文件的读取次数。对于提取文件名:“grep”将“PCOL.5_2016-11-03_090036694.log | cut-d”'-f4>file1”

我正在尝试实现一个脚本,该脚本自动读取下一代测序数据分析运行的日志文件,并在分析的每个步骤后报告读取计数。日志文件的格式始终相同

例如,包含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的第二行中,以此类推。然后,脚本应输出如下内容:

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()和一些条件语句实现相同的结果。

请格式化所有内容