0

我有以下形式的数据:

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

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

我希望我的最终输出看起来像以下形式:

      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"

感谢和抱歉编辑

4

2 回答 2

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保留变量第一列中的值previf ($1<prev){next}检查第一列是否小于先前存储的值,然后移至下一行,否则打印(1)。

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

awk '{if ($1<prev){next}}{prev=$1; gsub("\"", "", $2); $2=substr($2,0,3);$2="\""$2"\""}1' inputfile
于 2013-10-24T05:05:44.290 回答
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
于 2013-10-24T05:05:03.043 回答