私のファイルには、次のような数十の値があります。
(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コマンドは前の番号を抽出して/#
に渡します。各値の数が提供されます。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]+#
特定の入力例に示すように、パターンに一致するものが常に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