匹配日志文件中的两个模式并输出为表

时间:2016-09-07 18:18:29

标签: awk

我需要匹配日志文件中的两个模式,并且如果可能的话需要将输出作为表。日志文件有几行,其中包含我想要匹配的单词,以下是日志文件的示例:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

零错误检查:

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

如果某行有--out,则打印路径的基本名称,后跟选项卡。如果一行有p-value =,则打印数字和换行符。

在这种情况下,

awk很不错,因为您可以修改匹配的行。根据{{​​1}}进行思考,您必须部署其他工具(如grep)来获取所需的部件,然后将它们重新组合成有用的形式。您对sedgrep的使用是英勇的,并且可以通过调整来实现,而代价是更多的流程和已部署的工具。

你可以在一个更大的awk模式匹配块中执行此操作,这将更加防弹。我会留给读者练习。