我想更改以下命令,以便正则表达式匹配 /usr/share/dict/words 中恰好包含3 个 a 而不是至少3 个 a 的单词。
cat /usr/share/dict/words | grep "a.*a.*a" | grep -v "'s$" | wc -l
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我正在尝试使用pup解析 HTML 页面。这是一个命令行 HTML 解析器,它接受一般的 HTML 选择器。我知道我可以使用已安装在我的机器上的 Python,但我想学习如何使用 pup 来练习命令行。
我想抓取的网站是 https://ucr.fbi.gov/crime-in-the-us/2018/crime-in-the-us-2018/topic-pages/tables/table-1
我创建了一个 html 文件:
curl https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1 > fbi2018.html
Run Code Online (Sandbox Code Playgroud)
如何提取一列数据,例如“人口”?
这是我最初写的命令:
curl https://ucr.fbi.gov/crime-in-the-u.s/2018/crime-in-the-u.s.-2018/topic-pages/tables/table-1 > fbi2018.html
Run Code Online (Sandbox Code Playgroud)
它实际上有效,但它是一种丑陋的、hacky 的方式,这就是为什么我想使用 pup。我注意到“人口”列中我需要的所有值都headers="cell 31 .."
在<td>
标签内的某处。例如:
cat fbi2018.html | grep -A1 'cell31 ' | grep -v 'cell31 ' | sed 's/text-align: right;//' | sed 's/<[/]td>//' | sed 's/--//' | sed '/^[[:space:]]*$/d' | sort -nk1,1
Run Code Online (Sandbox Code Playgroud)
我想提取在其<td>
标签中具有此特定标头的所有值,在此特定示例中,这将是323,405,935
然而,pup 中的多个选择器似乎不起作用。到目前为止,我可以选择所有 td 元素:
cat fbi2018.html | pup 'td'
Run Code Online (Sandbox Code Playgroud)
但我不知道如何选择包含特定查询的标题。
编辑: 输出应该是: …
当我试图找到一列值的平均值时,我想得到确切的数字。
例如,这是输入值列:
1426044
1425486
1439480
1423677
1383676
1360088
1390745
1435123
1422970
1394461
1325896
1251248
1206005
1217057
1168298
1153022
1199310
1250162
1247917
1206836
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令时:
... | awk '{ sum+=$1} END { print sum/NR}'
Run Code Online (Sandbox Code Playgroud)
我得到以下的输出:1.31638e+06
。但是,我想要1316375.05
这种格式的确切数字,甚至更好 1,316,375.05
如何仅使用命令行工具执行此操作?
编辑 1
我发现了以下单行 awk 命令,它将为我提供最大值、最小值和平均值:
awk 'NR == 1 { max=$1; min=$1; sum=0 } { if ($1>max) max=$1; if ($1<min) min=$1; sum+=$1;} END {printf "Min: %d\tMax: %d\tAverage: %.2f\n", min, max, sum/NR}'
Run Code Online (Sandbox Code Playgroud)
为什么NR必须初始化为1?当我删除时NR == 1
,我得到了错误的结果。
编辑 2