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命令即可直接提取正数?

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

使用grep -P您可以这样做以获取所有正数:

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

您可以在数字之前的开始或空间上匹配:

$ 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 ' '只是从输出中删除任何初始空间,您可以跳过它。

您可以使用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/^ *//开始时剩余的前导空白。(可能有一种更简单的方法,但目前看不到。)

如果要保留列格式,则可以使用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

好吧,已经提供了用sed,grep和纯壳的解决方案,我给了一个尴尬。实际上,当问题是关于计算的问题时,我没有得到提供的答案,为什么使用某些适用于计算的工具。

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

相关内容

  • 没有找到相关文章

最新更新