如何统计列中do_id的唯一值数量(支持SQL/Bash实现)
统计URL中do_id的唯一值数量(SQL/Bash实现)
SQL 实现
MySQL/MariaDB
假设数据存在target_table表的url_data列中,通过正则提取do_id参数,解码URL编码字符后统计唯一值:
SELECT COUNT(DISTINCT URL_DECODE(SUBSTRING_INDEX(REGEXP_SUBSTR(url_data, 'do_id=[^&]*'), '=', -1))) AS unique_do_id_count FROM target_table;
如果你的MySQL版本不支持URL_DECODE,可以手动替换常见编码(比如%7D对应}):
SELECT COUNT(DISTINCT REPLACE(SUBSTRING_INDEX(REGEXP_SUBSTR(url_data, 'do_id=[^&]*'), '=', -1), '%7D', '}')) AS unique_do_id_count FROM target_table;
PostgreSQL
PostgreSQL 14+可以直接用uri_query_param提取参数,自动处理解码:
SELECT COUNT(DISTINCT uri_query_param(url_data, 'do_id')) AS unique_do_id_count FROM target_table;
低版本可以用正则+解码逻辑:
SELECT COUNT(DISTINCT convert_from(decode(replace(split_part(regexp_match(url_data, 'do_id=[^&]*'), '=', 2), '%', ''), 'hex'), 'utf8')) AS unique_do_id_count FROM target_table;
SQL Server
通过拆分URL参数提取do_id,替换编码后统计:
SELECT COUNT(DISTINCT REPLACE(SUBSTRING(value, CHARINDEX('=', value) + 1, LEN(value)), '%7D', '}')) AS unique_do_id_count FROM target_table CROSS APPLY STRING_SPLIT(SUBSTRING(url_data, CHARINDEX('?', url_data) + 1, LEN(url_data)), '&') WHERE value LIKE 'do_id=%';
Bash 实现
假设数据文件为data.txt,用管道工具组合处理:
grep -o 'do_id=[^&]*' data.txt | sed 's/do_id=//' | python3 -c "import sys, urllib.parse; print('\n'.join(urllib.parse.unquote(line.strip()) for line in sys.stdin))" | sort | uniq | wc -l
各步骤作用:
grep -o 'do_id=[^&]*':提取所有do_id=开头到下一个&的片段sed 's/do_id=//':移除do_id=前缀,只留参数值python3 ...:用Python做URL解码,处理%7D这类转义字符sort | uniq:对解码后的值去重wc -l:统计唯一值的数量
如果没有Python,用awk手动替换常见编码:
grep -o 'do_id=[^&]*' data.txt | sed 's/do_id=//' | awk '{gsub(/%7D/, "}"); gsub(/%7B/, "{"); print}' | sort | uniq | wc -l
内容的提问来源于stack exchange,提问作者roto
相关产品推荐
相关产品推荐

