【问题标题】:grep pattern to exclude negative numbers from filegrep 模式从文件中排除负数
【发布时间】:2014-02-28 22:20:23
【问题描述】:

我一直在努力想出一个更简单的答案来解决这个问题。但仍然使用 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 命令?

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

【问题讨论】:

  • 考虑编辑您的问题以包括预期输出与当前输出。 +1 很好的第一个问题。祝大家好运。

标签: regex bash shell grep


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

      你能用 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】:

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

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

        【讨论】:

          【解决方案5】:

          使用grep -P 你可以得到所有正数:

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

          【讨论】:

            猜你喜欢
            • 2014-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-30
            • 1970-01-01
            • 2012-07-23
            • 2013-01-19
            • 1970-01-01
            相关资源
            最近更新 更多