我需要匹配日志文件中的两个模式,并且如果可能的话需要将输出作为表。日志文件有几行,其中包含我想要匹配的单词,以下是日志文件的示例:
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
答案 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
)来获取所需的部件,然后将它们重新组合成有用的形式。您对sed
和grep
的使用是英勇的,并且可以通过调整来实现,而代价是更多的流程和已部署的工具。
你可以在一个更大的awk模式匹配块中执行此操作,这将更加防弹。我会留给读者练习。