正規表現によるグループ化と計算

正規表現によるグループ化と計算

私のファイルには、次のような数十の値があります。

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

ハッシュ記号の前の数字に基づいて各数字の数量を計算したいです(含めることもできます)

フォローしようとしましたが、常に0が出ました。

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

どんなアイデアがありますか?上記の例で私が望むものは次のとおりです。

123# 1
456# 1

答え1

grep + バッシュ:

$ 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コマンドは前の番号を抽出して/#に渡します。各値の数が提供されます。sortuniquniq -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]+#特定の入力例に示すように、パターンに一致するものが常に1行に1つずつあるとします。


結果からスペースをフィルタリングし、入力を処理するときにスペースをフィルタリングします。例:

(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]+#1行に複数の一致パターン ""がある入力の場合は、次のことができます。

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

関連情報