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

  • 本文关键字:高时 打印 一行 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'

Perl 解决方案:

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

它不会输出行24*因为 2.4 并不大于零。

$ 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

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

$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 语句移动到第一行,然后存储前一行。

最新更新