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

时间:2017-04-25 16:44:55

标签: python shell

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

例如,包含样本流程的行以&#34开头;将解析"并且示例名称位于第四列(字段)中。类似地,包含输出读数的行以" Trimmed output"开头。输出的读数在这些行的第三列(字段)中。我使用grep命令将样本名称和读取次数提取到两个新文件中。用于提取文件名:" grep"将" PCOL.5_2016-11-03_090036694.log | cut -d' ' -f4>文件1&#34 ;.并且为了提取每一步之后输出的读数:" grep"修剪输出:" PCOL.5_2016-11-03_090036694.log | cut -d' ' -f 3,6>文件2&#34 ;.

现在我想将file1中的样本名称与file2输出的读取数组合(合并)。 file1中的第1行对应于file2中的第1行,file1中的第2行对应于file2中的第2行,依此类推。换句话说,对于file1的第一行中的样本#1,输出的读取数量在file2的第一行中,而对于file1的第二行中的样本#2,输出的读取数量在file2的第二行中。然后脚本应输出如下内容:

sample #1 reads_1
sample #2 reads_2 

直到为所有样本返回所有读取输出。我的问题是什么是最好的方法呢?速度不是必要的考虑因素,因为有问题的日志文件不是很大 - 通常不到一千行。我开始编程很晚。 shell及其最基本的命令(" grep"," cat"," ls"," mkdir"," head&# 34;," 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

感谢您提供任何指导

2 个答案:

答案 0 :(得分:0)

因此,您可以使用Pandas来处理此任务。实际上你可能从一开始就使用它,即你使用grep的地方。虽然如果你已经有一个使用grep的流程,我会说要坚持下去。

假设文件以某种标准方式(逗号,标签,' |'等等)分隔,您可以轻松地将它们读入pandas.DataFrame's然后合并它们轴。例如,像这样:

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')

答案 1 :(得分:0)

由于您已经将两个数据集放在两个单独的文件中,假设它们包含的行数相等,您可以使用'paste'命令将它们合并在一起。

app.get("/get-data", function(request, response) {
  myData.getData(request, response);
});

根据我的个人经验,我已经意识到bash中的文本解析是有限的,更好的方法是转向Python(2.7)之类的语言。您可以使用其内置字符串util方法split(),startswith()和一些条件状态来实现相同的结果。