grep模式从文件中排除负数

时间:2014-02-04 19:02:13

标签: regex bash shell grep

我一直在努力想出一个更容易回答这个问题的方法。但仍然使用grep。

我想要查看myfile.dat的正(和负数)。 Myfile.dat看起来像这样:

-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模式。

负数:

grep -E -o [-][0-9]+.[0-9]+ myfile.dat

正数(这里我必须将所有数字输入另一个grep):

grep -Eo [-]\?[0-9]+.[0-9]+ myfile.dat | grep -v [-]

问题出在这里! 是否有grep模式允许我直接提取正数,而不使用第二个grep命令?

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

5 个答案:

答案 0 :(得分:3)

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

 grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file

答案 1 :(得分:2)

您可以在数字之前的行尾或空格匹配:

$ 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 :(得分:1)

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

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

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

答案 3 :(得分:1)

你能用sed代替grep吗? 删除负数:

sed "s/-[0-9.]*//g; s/^ //" myfile.dat

删除减号的每个序列,后跟数字和点s/-[0-9.]*//g。 并美化删除任何可能保留的前导空格s/^ //

只保留正数会有点棘手。

sed "s/^[0-9.]*//; s/ [0-9.]*/ /g; s/^ *//" myfile.dat

删除行s/^[0-9.]*//开头的数字和点。 用空白s [0-9.]*/ /g替换空白,后跟数字和点。最后再次美化,删除行s/^ *//开头的任何剩余前导空格。 (可能有一种更简单的方法,但目前看不到它。)

答案 4 :(得分:1)

好的,已经提供了sed,grep和pure shell的解决方案,我给了awk一个。事实上,我没有得到所提供的答案,当问题与计算有关时,为什么要使用一些不利于计算的工具。

 awk '{for (i=1;i<=NF;i++) if ($i>=0) print $i} ' file