如果第二行增加,我试图在第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'
答案 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语句移动到第一行,然后再存储前一行。