정규 표현식을 통한 그룹화 및 계산

정규 표현식을 통한 그룹화 및 계산

내 파일에는 다음과 같은 수십 개의 값이 있습니다.

(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]+#주어진 예제 입력에 표시된 것처럼 " " 패턴과 일치하는 항목이 한 줄에 항상 하나씩 있다고 가정합니다 .


결과에서 공백을 필터링하고 입력을 처리할 때 공백을 필터링합니다. 예:

(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

관련 정보