![复制接下来的行的最后一列](https://linux22.com/image/204659/%E5%A4%8D%E5%88%B6%E6%8E%A5%E4%B8%8B%E6%9D%A5%E7%9A%84%E8%A1%8C%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E5%88%97.png)
我有一个如下所示的文件:
文件:
900 1 37
900 2 41
900 3 278
918 1 9999
918 2 9999
918 3 9999
我想获得一个如下所示的新文件:
918 1 37
918 2 41
918 3 278
我想从上一组数字 (900) 中取出最后一列,并将其用于下一组数字 (918) 的最后一列。
我想要替换的值始终是 9999。基本上我想用最后一个“有效”值替换 9999 的所有内容(例如,当我有与 9999 不同的值时)。
答案1
Perl 来救援。
perl -lane 'if ($prev == $F[0])
{push @buff, $F[2]}
elsif ($F[2] == 9999)
{print join " ", @F[0,1], shift @buff}
else {$prev = $F[0]; @buff = $F[2]}
' -- file
-n
逐行读取输入,运行每一行的代码;-l
从输入中删除换行符并将其添加到输出中;-a
将空白处的每一行拆分到 @F 数组中;- 我们保留一个
@buff
er 来记住第 3 列中第 1 列中的最后一个数字,并在 中记住$prev
。如果第 1 列中的数字与前一行相同,我们将最后一列添加到缓冲区中; - 如果最后一个数字是 9999,我们打印前两列的值,但使用最后一列的缓冲区;
- 否则,新的部分已开始。我们重新初始化缓冲区并重置 $prev。
稍微短一点的版本:
perl -lane 'if($F[2]==9999){print join" ",@F[0,1],shift@buff}else{@buff=()if$prev!=$F[0];push@buff,$F[2];$prev=$F[0]}' -- file
答案2
$ awk '$3==9999{$3=p[$2]; print} {p[$2]=$3}' file
918 1 37
918 2 41
918 3 278