我想打印出不会从一行增加到下一行的值(或标识行)。
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”,并标识一行或另一行或两者。
这可以是一种方式:
awk 'prev>=$1 {print $0, "<----"; a[$1]=NR; next} prev=$1;
END{print "** 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; END{print "** 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; END{print "** 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
如果你有sort
,它可以提供你所需要的一切。使用选项-c
检查手册页。
例如,使用您的数据:
kent$ echo "1001
1002
1003
1004
1005
1006
1007
1004
1008
1009"|sort -c
sort: -:8: disorder: 1004
所以你得到了行号和那条线。
Perl 解决方案:
perl -ne 'print $previous if $_ < $previous; $previous = $_' input.txt
只要记住上一行,比较,如果需要就打印。
使用来自@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