如果第二行增加,我正在尝试获取第 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 语句移动到第一行,然后存储前一行。