删除小于先前值的数值

时间:2013-10-24 04:56:13

标签: python linux ubuntu sed grep

我的数据如下:

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

我想删除所有从小于前一个数值的数值开始的行(即我想删除:2“def”为2< 23491数字)

我希望我的最终输出看起来如下:

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

我知道我可以使用像python这样的编程语言以编程方式编写。但是可以使用像sed,grep等一些linux命令来做同样的事情

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

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

感谢并抱歉编辑

2 个答案:

答案 0 :(得分: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<prev){next}检查第一列是否小于存储的上一个值,然后移至下一行打印(1)。

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

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

答案 1 :(得分:0)

你可能会使它与这个脚本一起工作,(虽然没有经过测试,但可能需要进行更改)。

#!/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