次の行の最後の列をコピーします。

次の行の最後の列をコピーします。

次のファイルがあります。

文書:

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入力内容を1行ずつ読み、各行のコードを実行します。
  • -l入力から改行を削除し、出力に追加します。
  • -a空のスペースの各行を @F 配列に分割します。
  • @buff3列と1列の最後の数字を記憶するためにerを維持します$prev。列 1 の数字が前の行と同じ場合、最後の列をバッファーに追加します。
  • 最後の数字が9999の場合、最初の2つの列の値を印刷しますが、最後の列のバッファを使用します。
  • それ以外の場合は、新しいセクションが開始されました。バッファを再初期化して $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

おすすめ記事