我的文件中有几十个值,例如
(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
/ uniq
。 uniq -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