You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本获取2022年世界幸福国家无输出问题排查

问题:提取2022年全球幸福报告前5国家的Bash脚本无输出

我尝试通过curl获取维基百科世界幸福报告的原始数据,编写Bash脚本提取2022年排名前5的全球最幸福国家。以下是我的代码:

#!/bin/bash
content=$(curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw")
lines=$(echo "$content" | grep '^\|' | sed -n '/2022/{n;p;}')
top_5=$(echo "$lines" | awk '{print $3}' | sort | head -n 5)
echo "$top_5"

但在Ubuntu中运行该脚本时无任何输出,终端显示空白:

....(My computer server).....:~$ bash happy_countriesnew.sh
#(I'm expecting there to be a list here)
....(My computer server).....:~$

我期望得到前5的国家列表:

Finland
Norway
Denmark
Iceland
Switzerland

问题分析与修复方案

错误点说明

  • grep正则无效:原脚本中grep '^\|'的正则逻辑错误,无法筛选维基百科表格的有效行,应改为匹配以|开头的表格行。
  • sed定位逻辑错误:sed -n '/2022/{n;p;}'仅能打印包含"2022"行的下一行,无法覆盖整个2022年表格的数据块。
  • awk列数与排序逻辑错误:维基表格中国家名称是分割后的第三列(而非原脚本的$3),且表格本身已按排名排序,sort命令会打乱原有顺序,完全多余。

修改后的脚本

#!/bin/bash
# 获取维基百科幸福报告原始内容
content=$(curl -s "https://en.wikipedia.org/wiki/World_Happiness_Report?action=raw")

# 提取2022年幸福报告表格的前5个国家
echo "$content" | awk '
    /2022/ {in_table=1; next}          # 定位到2022表格表头,标记进入表格模式
    in_table && /^|/ {                 # 仅处理表格内的行
        split($0, cols, /\|/);         # 按|分割表格列
        if (cols[2] ~ /^[0-9]+/) {     # 筛选带排名的有效数据行(排除表头)
            gsub(/^[[:space:]]+|[[:space:]]+$/, "", cols[3]); # 去除国家名称前后空格
            print cols[3]
        }
    }
    in_table && !/^|/ {exit}           # 离开表格区域时退出
' | head -n 5

脚本说明

  1. 用awk精准定位2022年表格块:匹配到包含"2022"的行后,进入表格处理模式;
  2. 按|分割表格行,筛选出带数字排名的有效数据行,排除表头;
  3. 去除国家名称前后的空格,确保输出格式整洁;
  4. 直接取前5行,得到按排名排序的前5个幸福国家;
  5. 遇到非表格行时自动退出,避免处理无关内容。

内容的提问来源于stack exchange,提问作者Deezel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:40:56