首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中排除负数的grep模式

从文件中排除负数的grep模式
EN

Stack Overflow用户
提问于 2014-02-05 03:02:13
回答 5查看 3.9K关注 0票数 5

我一直在努力想出一个更简单的答案来解决这个问题。但仍在使用grep。

我想对myfile.dat的正数(和负数)进行grep。Myfile.dat看起来像这样:

代码语言:javascript
复制
-1.4987 4.1354  -8.1235
4.2322  -0.9842 -2.6845
3.6845  1.5132  -2.8452
0.0122  9.3542  -1.2354
-7.2127 -1.1253 -4.3967
0.3535  7.2416  -3.1277

不需要保留列格式。因此,我使用了以下grep模式。

负数:

代码语言:javascript
复制
grep -E -o [-][0-9]+.[0-9]+ myfile.dat

正数(这里我必须将所有数字通过管道传递到另一个grep中):

代码语言:javascript
复制
grep -Eo [-]\?[0-9]+.[0-9]+ myfile.dat | grep -v [-]

问题来了!有没有一种grep模式允许我直接提取正数,而不需要使用第二个grep命令?

这都是关于模式的,而不是我是否可以使用另一个命令。

EN

回答 5

Stack Overflow用户

发布于 2014-02-05 03:05:52

使用grep -P,您可以执行以下操作以获得所有正数:

代码语言:javascript
复制
 grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file
票数 3
EN

Stack Overflow用户

发布于 2014-02-05 03:10:06

您可以在行首或数字前的空格上进行匹配:

代码语言:javascript
复制
$ grep -oE '(^| )[0-9]+\.[0-9]+' Myfile.dat | tr -d ' '
4.1354
4.2322
3.6845
1.5132
0.0122
9.3542
0.3535
7.2416

tr -d ' '只是从输出中删除任何开头的空格,如果不需要,您可以跳过它。

票数 2
EN

Stack Overflow用户

发布于 2014-02-05 03:42:35

如果希望保留列格式,可以使用BASH read循环。

循环遍历每一行的数组,以检查和取消设置每个负值元素。

代码语言:javascript
复制
while read -a n; do
    for i in ${!n[@]}; do
        if [[ ${n[$i]} =~ ^- ]]; then
            unset n[$i]
        fi
    done
    if [[ -n $n ]]; then
        echo ${n[@]}
    fi
done < myfile.dat
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21561101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档