我的数据如下:
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"
感谢并抱歉编辑
答案 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