【问题标题】:Remove numerical values which are lesser than preceding value删除小于前一个值的数值
【发布时间】:2013-11-02 15:33:59
【问题描述】:

我有以下形式的数据:

      1      "there"
      ...
      23489  "abc"
      23490  "hello"
      23491  "hi"
      2      "def"
      23492  "stackoverflow"

我想删除所有从小于前一个数值的数值开始的行(即我想删除:2 "def" as 2

我希望我的最终输出如下所示:

      1      "there"
      ...
      23489  "abc"
      23490  "hello"
      23491  "hi"
      23492  "stackoverflow"

我知道我可以使用诸如 python 之类的编程语言以编程方式做到这一点。但是是否可以使用一些 linux 命令(如 sed、grep 等)来做同样的事情

编辑:问题的解决方案非常优雅。是否也可以使用当前解决方案将字符串的长度(存在于第二列中)限制为 3。即我希望我的输出看起来像以下形式:

      1      "the"  
      ...
      23489  "abc"
      23490  "hel"
      23491  "hi"
      23492  "sta"

感谢编辑,抱歉

【问题讨论】:

    标签: python linux ubuntu sed grep


    【解决方案1】:

    您可能可以使它与这个脚本一起工作,(虽然未经测试,因此可能需要进行更改)。

    #!/bin/bash
    PV="0"
    for l in (data.txt)
    do
        CV=$(echo $l | sed "s/[^[0-9]+]//g")
        if [ "$CV" -gt "$PV" ]
        then
          echo "${l}"
        fi
        PV=$CV
    done
    

    【讨论】:

      【解决方案2】:

      使用awk 你可以说:

      awk '{if ($1<prev){next}}{prev=$1}1' inputfile
      

      对于您的输入,它会返回:

      $ awk '{if ($1<prev){next}}{prev=$1}1' inputfile
      1      "there"
      23489  "abc"
      23490  "hello"
      23491  "hi"
      23492  "stackoverflow"
      

      prev=$1 会保留变量prev 中第一列的值。 if ($1&lt;prev){next} 检查第一列是否小于先前存储的值,然后移至下一行,否则打印 (1)。

      编辑:要限制第二列中字符串的长度,您可以说:

      awk '{if ($1<prev){next}}{prev=$1; gsub("\"", "", $2); $2=substr($2,0,3);$2="\""$2"\""}1' inputfile
      

      【讨论】:

      • 是的,这是一个更甜蜜的解决方案:)
      • @devnull 非常感谢您的帮助。如果可能的话,你能解释一下吗..请
      • @AliceEverett 添加了上面的解释。
      • @devnull 是否也可以在同一命令中将字符串的长度限制为 3.. 我知道这是一个有点独立的问题..但是因为您的解决方案非常优雅。 .因此我想结合长度限制使用用户解决方案
      • @AliceEverett 字符串的长度是什么意思?输入中第一列的长度?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-06-07
      • 2020-07-23
      相关资源
      最近更新 更多