当下一行变高时打印当前行

时间:2018-05-27 19:27:07

标签: bash awk

如果第二行增加,我试图在第3列中获取当前行。例如,这是我的输入文件

 9* 2.3 0.3 1.01101  28.8
10* 3   0.3 1.01091  20.8
11* 3   0.3 1.01091  20.8
12* 3.6 0.9 1.00578  20.8
13* 4   0.9 1.00553  0
14* 4   0.9 1.00553  0
15* 4.5 1.4 1.01251  0
18* 6   1.4 1.01334  25
19* 6.5 1.8 1.00742  25
20* 7   1.8 1.00832  8.3
21* 7   1.8 1.00832  8.3
22* 7.6 2.4 1.01134  8.3
23* 8   2.4 1.00443  0
24* 8   2.4 1.00443  0

我想要像这样的输出

11* 3   0.3 1.01091 20.8
14* 4   0.9 1.00553 0
18* 6   1.4 1.01334 25
21* 7   1.8 1.00832 8.3
24* 8   2.4 1.00443 0

所以,如果你注意到我只选择了下一行之前的行,那么在第3列中,它会变得更高。我尝试过这个脚本,但似乎只需要前一行等于下一行。

awk  '$3==last{next} {last=$3} 1'

3 个答案:

答案 0 :(得分:0)

Perl解决方案:

perl -ane 'print $prev if $F[2] > $col3; $col3 = $F[2]; $prev = $_' < file

它不会输出行24*,因为2.4不会更大。

答案 1 :(得分:0)

$ awk 'NR>1 && $3>p3{print p0} {p3=$3; p0=$0}' file
11* 3   0.3 1.01091  20.8
14* 4   0.9 1.00553  0
18* 6   1.4 1.01334  25
21* 7   1.8 1.00832  8.3

$ awk 'NR>1 && $3>p3{print p0} {p3=$3; p0=$0} END{print p0}' file
11* 3   0.3 1.01091  20.8
14* 4   0.9 1.00553  0
18* 6   1.4 1.01334  25
21* 7   1.8 1.00832  8.3
24* 8   2.4 1.00443  0

答案 2 :(得分:0)

如果您想知道为什么命令失败,请让我为您分析一下:

$3==last{next}
{last=$3}
1

这基本上是这样的:

  • $3==last{next}:如果第三列等于存储值last,请跳至下一行
  • {last=$3}:如果第三列与存储值last不同,请将last设置为第三列的值。
  • 1:打印当前行。

如您所见,您打印当前行而不是上一行。您所要做的就是存储前一行并打印该行(第一条记录除外)。我们还了解到您的输入是明确排序的,否则,您将不会使用等号。您的脚本的更新版本将是:

($3!=last) && (NR>1){print prev}
{last=$3; prev=$0}

如您所见,通过稍微反转逻辑,我们可以将print语句移动到第一行,然后再存储前一行。