【问题标题】:how to find/fetch number in a file using shell script如何使用 shell 脚本在文件中查找/获取数字
【发布时间】:2013-06-07 04:07:54
【问题描述】:

我是 Linux Shell 脚本的新手 据我所知,在文件中使用查找数字可以使用 grep

egrep -o "[0-9][0-9]*" my_file

但是我如何获得这些字符串的第一位并使其成为统计数据.. 比如 1234, 123, 1267 所以我得到 1 的 3 次

我知道使用

A=$(tr -cd 1 < page.html|wc -c)

可以在文件中获取数字“1”计数,但这不是我想要的...... 我想数第一个数字“1”...... 这就是为什么它对我来说如此困难......

请帮助...... 非常感谢。

【问题讨论】:

  • 提供文件的样本数据和您的预期输出。

标签: linux bash shell ubuntu


【解决方案1】:
A=$(egrep -o '[0-9]+' my_file | egrep -c '^1')

第一个egrep 找到所有数字并输出它们。第二个egrep 使用-c 选项输出匹配计数,正则表达式匹配以1 开头的行。

【讨论】:

  • 天哪.....这真的很有帮助....我使用,A=$(egrep -o "[0-9][0-9]*" page.html | egrep -c '^1') 但是如果我可以 grep 包括浮点数在内的所有数字呢?
  • 请参阅stackoverflow.com/questions/2139715/… 以使用正则表达式匹配浮点数
  • 我只是在 SO 搜索栏中输入 regex floating point 即可找到它。
【解决方案2】:

从问题看来,文件包含各种字符,您想隔离文件中所有数字的前几位。看起来数字不必是一行的第一个单词(如在它之前没有任何空格)。牢记这两个假设,您可以执行以下操作:

grep '[0-9]' test.html| sed 's/\([0-9]\+\)/\n\1\n/g' |grep '^[0-9]' |cut -c1 |sort |uniq -c

一个例子:

curl -N -s 'http://stackoverflow.com/users/1353267/samveen' |grep '[0-9]' |sed 's/\([0-9]\+\)/\n\1\n/g' |cut -c1 |grep '^[0-9]' |sort |uniq -c

重要提示:在上面的示例页面中,有一行{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":1353267,"accountId":1430801,"gravatar":"&lt;div class=\"\"&gt;,将分为以下几行:

{"fkey":"
8
f
1
a
9
c
6
e
21503516793
b
853265
ec
4939
","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

如果您不希望这种行为,sed 模式将更改为
sed 's/\b\([0-9]\+\)\b/\n\1\n/g',这意味着现在搜索独立数字(\b 是单词边界),并且sed 命令现在是:

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1353267
,"accountId":
1430801
,"gravatar":"<div class=\"\">

此外,如果巧妙地选择了sed 转换,则不需要剪切命令。也就是说,如果
\([0-9]\+\) 模式的部分更改为\([0-9]\)[0-9]*,那么 sed 将只显示每个数字的第一个数字,而不是整个数字。因此不再需要cut -c1。使用
sed 's/\b\([0-9]\)[0-9]*\b/\n\1\n/g',我们得到:

{"fkey":"8f1a9c6e21503516793b853265ec4939","isRegistered":true,"userId":
1
,"accountId":
1
,"gravatar":"<div class=\"\">

因此,不需要切割。

根据输入文件的更多信息,可以进一步优化命令。

【讨论】:

  • 哇......更好的答案......但我只需要输出计数,不知道该怎么做......
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 2015-10-31
  • 2022-12-05
  • 1970-01-01
  • 2020-02-17
  • 2015-02-28
  • 2019-09-06
  • 2016-02-06
相关资源
最近更新 更多