如果第二行的列大于第二行的列,则打印行

时间:2019-09-03 02:50:37

标签: bash shell awk sed

我有一个包含多行的文件,所有行在第二列中都有一个日期。我正在寻找一个命令,如果日期大于下一行的日期,则该命令将打印整行。
如果不再需要这种情况,请不要打印其他任何内容。

我是菜鸟,所以如果您能解释一下答案,那就太好了。

我正在尝试使用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

2 个答案:

答案 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的同时打印
  • 此版本将跳过数据之间的打印空白行(如果存在),否则将不存在。