仅查找从一行到下一行的递增值[关闭]

Posted

技术标签:

【中文标题】仅查找从一行到下一行的递增值[关闭]【英文标题】:Find only increasing values from one line to the next [closed] 【发布时间】:2013-11-17 22:49:59 【问题描述】:

我想打印出从一行到下一行增加的值(或标识行)。

Perl、Awk/Sed、bash 或 python...任何都可以。

1001<br>
1002<br>
1003<br>
1004<br>
1005<br>
1006<br>
1007<br>
1004<br>
1008<br>
1009<br>

这应该从“1007”定位到下一行“1004”并标识一行或另一行或两者。

【问题讨论】:

你试过什么?您必须证明您确实尝试过自己解决问题。 【参考方案1】:

这可以是一种方式:

awk 'prev>=$1 print $0, "<----"; a[$1]=NR; next prev=$1;
    ENDprint "** repeated lines **";
        for (i in a) print "line "a[i]" value",i; printf "\n"' file

测试

$ awk 'prev>=$1 print $0, "<----"; a[$1]=NR; next prev=$1; ENDprint "** repeated lines **"; for (i in a) print "line "a[i]" value",i; printf "\n"' a
1001
1002
1003
1004
1005
1006
1007
1004 <----
1008
1009
** repeated lines **
line 8 value 1004

其他输入:

$ cat a
1006
1007
1004
1008
1009
133
1333
123
$ awk 'prev>=$1 print $0, "<----"; a[$1]=NR; next prev=$1; ENDprint "** repeated lines **"; for (i in a) print "line "a[i]" value",i; printf "\n"' a
1006
1007
1004 <----
1008
1009
133 <----
1333
123 <----
** repeated lines **
line 8 value 123
line 6 value 133
line 3 value 1004

【讨论】:

+1 表示指针&lt;---,但我认为打印行号会更好。想想文件是否有 3000 行 好主意,@Kent,刚刚进行了相应的更新。我记得我们过去都回答过类似的问题,但找不到... 好的,那我也发布这个问题的另一个答案:)【参考方案2】:

如果您有sort,它可以满足您的所有需求。使用选项 -c 检查手册页。

例如,使用您的数据:

kent$  echo "1001
1002
1003
1004
1005
1006
1007
1004
1008
1009"|sort -c
sort: -:8: disorder: 1004

所以你得到了行号和那一行。

【讨论】:

这不会发现 1007->1007 没有增加。【参考方案3】:

使用来自@fedorqui 解决方案的数据的基于 Python 的解决方案:

>>> from itertools import tee, izip
with open('abc1') as f:
    t1, t2 = tee(f)
    next(t2)
    for line1, line2 in izip(t1, t2):
        if int(line1) > int(line2):
            print line1, line2
...             
1007
1004

1009
133

1333
123

【讨论】:

【参考方案4】:

Perl 解决方案:

perl -ne 'print $previous if $_ < $previous; $previous = $_' input.txt

只要记住上一行,比较,如果需要就打印。

【讨论】:

以上是关于仅查找从一行到下一行的递增值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

[剑指offer] 二维数组中的查找

剑指Offer(书):二维数组中的查找

剑指Offer——二维数组中的查找

1.二维数组的查找

数据结构二维数组中的查找

剑指offer二维数组中的查找