通过正则表达式进行分组和计数

通过正则表达式进行分组和计数

我的文件中有几十个值,例如

(1608926678.237962) vcan0 123#0000000158
(1608926678.251533) vcan0 456#0000000186

我想根据哈希符号之前的数字来计算每个数字的数量(也可以包括它)

我尝试跟随但始终为零

 grep -o '\b\d+#\b' ./file.log | wc -l

有任何想法吗?对于上面的例子我想要:

123# 1
456# 1

答案1

grep + bash:

$ grep -Eo '\b[0-9]+#\b' ./file.log  | sort | uniq -c  | while read -r a b; do echo "$b" "$a"; done
123# 1
456# 1

答案2

这并不完全是您描述的输出,但如果这确实是一个硬要求,则可以将其调整为该格式,但是:

awk -F'[ #]' '{print $3}' input | sort -n | uniq -c

awk 命令将提取您之前的号码#,然后将其传递给sort/ uniquniq -c将提供每个值的计数。


要获取输出格式:

awk -F'[ #]' '{print $3}' input | sort -n | uniq -c | awk '{print $2"#",$1}'

答案3

使用 GNU awk

awk -v FPAT=' [0-9]+#' '{ c[$1]++; }; END{ for(x in c) print x, c[x]; }' infile
 123# 1
 456# 1

假设每行始终有一个模式“ [0-9]+#”匹配,如给定的示例输入所示;


从结果中过滤掉空格,以及在处理输入时过滤掉空格,例如:

(1608926678.237962) vcan0        123#0000000158
(1608926678.251533) vcan0 456#0000000186
(1608926678.237962) vcan0    123#0000000158
(1608926678.251533) vcan0 456#0000000186
(1608926678.237962) vcan0      123#0000000158
(1608926678.251533) vcan0                       456#0000000186
(1608926678.237962) vcan0 123#0000000158

awk -v FPAT='[ \t][0-9]+#' '{
    filter=$1; sub(/[ \t]/, "", filter);
    c[filter]++;
};
END{ for(x in c) print x, c[x]; }' infile
456# 3
123# 4

[0-9]+#对于每行中具有多个匹配模式“”的输入,您可以执行以下操作:

awk -v FPAT='[ \t][0-9]+#' '{
    for (i=1; i<=NF; i++){ 
        filter=$i; sub(/[ \t]/, "", filter); c[filter]++;
    };
};
END{ for(x in c) print x, c[x]; }' infile

答案4

awk '{for(i=1;i<=NF;i++){if($i ~ /#/){print $i}}}' filename| awk -F "#" '{print $1"#",gsub($1,$0)}'

输出

123# 1
456# 1

相关内容