小编rpl*_*lee的帖子

grep - 将在字符串中准确找到 3 个 a 的正则表达式

我想更改以下命令,以便正则表达式匹配 /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)

我该怎么做呢?

command-line grep regular-expression

9
推荐指数
2
解决办法
1058
查看次数

使用 pup 解析 HTML

我正在尝试使用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)

但我不知道如何选择包含特定查询的标题。

编辑: 输出应该是: …

command-line html

4
推荐指数
1
解决办法
1610
查看次数

awk 的数字格式和舍入问题

当我试图找到一列值的平均值时,我想得到确切的数字。

例如,这是输入值列:

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

我从有没有办法在单个命令中获取数字列表的最小值、最大值、中值和平均值中找到以下 …

command-line awk numeric-data mawk text-formatting

4
推荐指数
2
解决办法
776
查看次数