Bash

複製即將到來的行的最後一列

  • April 14, 2022

我有一個看起來像這樣的文件:

文件:

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 的值時)。

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記住第 1 列中最後一個數字的第 3 列的 er,記住在 中$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

引用自:https://unix.stackexchange.com/questions/698796