2016-09-07 66 views
0

我需要匹配日志文件中的两种模式,并且如果可能的话需要将输出作为表获取。日志文件有几行我想匹配的话,这里是日志文件的例子:匹配日志文件中的两种模式并输出为表

Seed for random set to: uuzTjCqMVRk= 
    --out /home/ALL/ADRL.GLND.FET-EnhA 
    --max-shift False 
    --min-shift False 

p-value = 0.542 

Seed for random set to: P2+shGCxj70= 
    --out /home/ALL/BLD.CD14.MONO-EnhA 
    --max-shift False 
    --min-shift False 

p-value = 0.737 

我想获得这样的(制表符分隔导出为文本文件)的输出:

Group Pvalue 
ADRL.GLND.FET-EnhA 0.542 
BLD.CD14.MONO-EnhA 0.737 

我想这样做在bash是否有可能

编辑:

这是我曾尝试:

grep 'out' file.log | awk '{print $0}' > file1.txt 
grep 'p-value' file.log | awk '{print $0}' > file2.txt 
paste -d"\t" file1.txt file2.txt > pval.txt 
+2

你可以粘贴你尝试过什么? –

回答

1

零错误检查:

awk '/--out/ { sub(".*/","",$2);printf "%s\t",$2; } /p-value =/{ print $3; }' < file.log 

如果线路具有--out,打印路径后跟一个标签的基本名称。如果一行有p-value =,则打印该号码和一个换行符。

awk很好,在这种情况下,因为你可以修改你匹配的行。根据grep考虑,您必须部署其他工具(如sed)才能获得所需的零件,然后将它们重新组装为有用的表单。您对greppaste的使用是英勇的,通过调整可以发挥作用,但需要花费更多的流程和部署工具。

你可以在一个更大的awk模式匹配块中做到这一点,这将更加防弹。我将作为练习留给读者。

2
$ awk -F'[/ ]' -v OFS='\t' 'BEGIN{print "Group","Pvalue"} (NR%7)==2{g=$NF} (NR%7)==6{print g, $NF}' file 
Group Pvalue 
ADRL.GLND.FET-EnhA  0.542 
BLD.CD14.MONO-EnhA  0.737 

或者如果你喜欢:

$ awk -F'[/ ]+' -v OFS='\t' 'BEGIN{print "Group","Pvalue"} $2=="--out"{g=$NF} $1=="p-value"{print g, $NF}' file 
Group Pvalue 
ADRL.GLND.FET-EnhA  0.542 
BLD.CD14.MONO-EnhA  0.737 
相关问题