为何用awk提取2022世界幸福报告国家名单失败?求解决方案
修复方案与可行命令
原命令的问题
你的awk命令无法运行的核心原因有两个:
- 正则表达式中的
[是特殊字符,需要用反斜杠转义,原命令里的[[ *]]会被awk解析为无效的正则字符组; - 直接把
[[...]]设为记录分隔符(RS)会提取到页面中所有[[包裹的内容,而不仅仅是2022年排名表格里的国家名,结果会包含大量无关链接。
精准提取的awk命令
先通过curl获取维基百科的原始文本,再用awk定位2022年排名表格的行,提取其中的国家名:
curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw" | awk '/^\|\s*[0-9]+\s*\|\s*\[\[/ {match($0, /\[\[([^\]|]+)/, arr); print arr[1]}' | head -6
这个命令的逻辑:
- 匹配以
|开头、包含数字排名和[[的表格行(对应2022年排名的行); - 用
match函数提取[[之后、]或|之前的内容(处理类似[[Finland|Finland]]的格式); - 用
head -6取前6个国家,正好是你需要的结果。
替代方案:grep + sed组合
如果更习惯用grep和sed,也可以用以下命令:
curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw" | grep -E '^\|\s*[0-9]+\s*\|\s*\[\[' | sed -E 's/.*\[\[([^\]|]+).*/\1/' | head -6
逻辑和awk版本一致,先筛选目标行,再用sed替换提取国家名。
内容的提问来源于stack exchange,提问作者Dave Shah
相关产品推荐
相关产品推荐

