我有一个包含多行的文件,所有行在第二列中都有一个日期。我正在寻找一个命令,如果日期大于下一行的日期,则该命令将打印整行。
如果不再需要这种情况,请不要打印其他任何内容。
我是菜鸟,所以如果您能解释一下答案,那就太好了。
我正在尝试使用awk(答案可以是任何命令)
awk '$2 > ?nextline?$2 {print}' file
我找不到如何检查下一行,或者在第一次大于大于命令不正确后如何停止。
输入:
Jan 20 text1
Jan 15 text2
Jan 15 text3
Jan 3 text4
Jan 27 text5
Jan 17 text6
(more lines...)
想要的输出:
Jan 20 text1
Jan 15 text2
Jan 15 text3
Jan 3 text4
答案 0 :(得分:0)
通常,您必须撤消要求。如果下一行因为sed,awk等看不到未来而没有输出当前行,则需要停止打印,如果当前行与上一行相比有什么变化,则需要停止打印,因为awk和朋友可以通过将其存储在变量中来查看过去。
由于您说的语言无关紧要,所以一种简单的方法是:
perl -palE 'BEGIN {$h = 999} last if $F[1] > $h; $h = $F[1]' < file
我们在这里所做的是在-p
“将循环中的perl通过输入和打印行循环”,-a
“将行中的行自动分割成{{1 }}变量”,@F
“自动处理行尾”(此处并非严格要求,但大部分时间只是一个好习惯),以及-l
“执行指定了perl当前版本的下一个参数中的代码”(-E
在这里就足够了,不过,再次习惯一下)。并且我们传入的代码通过将-e
(此时允许的最高值)设置为超出范围的值开始,我假设没有数字将是999+,因为您说的是一个月的某天,使用$h
如果当前日期高于允许的最高值,则终止循环,如果超过last
,则将该最高点设置为当前值。现在,Perl自动打印出当前行并循环到下一行。
关键是我们只查看当前行,并在变量中跟踪相关的历史记录,因此我们无需展望未来。
答案 1 :(得分:0)
awk
版本:
awk 'f && $2>f {exit} 1; {f=$2}' file
Jan 20 text1
Jan 15 text2
Jan 15 text3
Jan 3 text4
f && $2>f {exit}
测试是否设置了f
并且第二字段大于f
?是的,退出程序。1;
始终为真,因此打印该行。{f=$2}
将f
设置为第二个字段。冷甚至可以缩短一些时间:
awk 'f&&$2>f{exit}f=$2' file
f=$2
通过将其设置为图案,它将是真实的,并且在f
设置为$2
的同时打印