我有一些日志文件,例如:
[INFO] [TYPE] entryA: aaa entryB: bbb entryD: ddd
但是某些条目未记录在某些文件中。如果我想将某些值提取到CSV文件中,使缺少的输入值为空或特定值,该怎么办? 例如,提取A,B,C和D时上述行的理想输出为:
aaa,bbb,null,ddd
或
aaa,bbb,,ddd
答案 0 :(得分:2)
考虑到entryC
和entryD
是可选的这一点,您可以使用正则表达式组:
/.*entryA:\s(\w+).*entryB:\s(\w+)(?:\sentryC:\s(\w+).*|\sentryD:\s(\w+).*)/
应替换为:
$1,$2,$3,$4
结果将是:
"aaa,bbb,,ddd"
答案 1 :(得分:1)
Perl解决方案:
您可以通过使用正则表达式中的?
量词使这些条目为可选:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $line = '[INFO] [TYPE] entryA: aaa entryB: bbb entryD: ddd';
my %entries;
@entries{qw{ A B C D }} = $line =~ /\[INFO\] \[TYPE\](?: entryA: )?(\S*)(?: entryB: )?(\S*)(?: entryC: )?(\S*)(?: entryD: )?(\S*)/;
say join ',', @entries{qw{ A B C D }};
但是在循环中一一提取条目更容易:
my %entries;
$entries{$1} = $2 while $line =~ /entry([A-D]): (\S+)/g;
say join ',', map $_ // "", @entries{qw{ A B C D }};
答案 2 :(得分:1)
能否请您遵循awk
,并告诉我这是否对您有帮助。考虑到您的实际Input_file与所示示例相同。
awk '
BEGIN{
array["A"];
array["B"];
array["C"];
array["D"]
}
{
for(i=1;i<=NF;i++){
if($i=="entryA:" || $i=="entryB:" || $i=="entryC:" || $i=="entryD:"){
gsub(/entry|:/,"",$i);
a[$i]=$(i+1)}
};
for(j in array){
val=j in a?(val?val "," a[j]:a[j]):(val?val "," "null":"null")
};
print val;
val=""
}' Input_file