パターンが一致する場合は、行全体を前の行のデータ(何でも)に置き換えます。

パターンが一致する場合は、行全体を前の行のデータ(何でも)に置き換えます。

入力ファイル

Time      Value  Flag
06:15:10  49.95  Actual
00:00:00  0.00  NoValue
06:22:50  49.94  Actual
06:23:00  49.93  Actual
06:23:10  49.93  Actual
06:23:20  49.93  Actual
06:23:30  49.93  Actual
06:24:40  49.92  Actual
00:00:00  0.00  NoValue

単語に一致する行全体を置き換える必要がありますNoValue。つまり、スクリプトが を含む行を探すたびに、行全体NoValueを最後に記録された時刻に置き換えます。

私の結果は次のように表示されます。

Time      Value  Flag
06:15:10  49.95  Actual
06:15:10  49.95  Actual
06:22:50  49.94  Actual
06:23:00  49.93  Actual
06:23:10  49.93  Actual
06:23:20  49.93  Actual
06:23:30  49.93  Actual
06:24:40  49.92  Actual
06:24:40  49.92  Actual

頑張りました

awk 'NR%3==NoValue{ name=$0; next } { print name, $0 }' Inputfile

しかし、それは私が望んでいないマージラインです。

私のオペレーティングシステムのバージョンはSolaris 5.8です。

答え1

条件がtrueの場合、awk前の行を印刷できます。$3 == "NoValue"

awk '$3 == "NoValue" { $0=prev }{prev=$0} 1' file
Time      Value  Flag
06:15:10  49.95  Actual
06:15:10  49.95  Actual
06:22:50  49.94  Actual
06:23:00  49.93  Actual
06:23:10  49.93  Actual
06:23:20  49.93  Actual
06:23:30  49.93  Actual
06:24:40  49.92  Actual
06:24:40  49.92  Actual

「条件が満たされたら、前の行を印刷します」が表示されます。https://stackoverflow.com/questions/27740937/print-previous-line-if-condition-is-met

答え2

ストリームエディタsedを使用すると、次のことができます。

sed -e '
  h
  $!N
  /Actual\n.*NoValue$/ {
    g
    G
  }
  P
  D
' Input file

  • bourne シェルまたはそのバリアントを使用し、コマンドラインで実行するとします。
  • sed コードは一度に 2 行をチェックし、1 行目が「Actual」で終わり、2 行目が「NoValue」で終わると、2 行目が削除され、1 行目がその場所に埋められます。
  • 最初の行(P)を印刷して削除し、(D)空でない場合は、既存のパターンスペースを使用してsedコードを再実行します。

答え3

これは2行のsedで簡単に行うことができます。私たちがしなければならないのは、印刷する前に各行を予約済みスペースにコピーすることだけです。その後、次に終わるすべての項目を置き換えることができますNoValue

#!/bin/sed -f

# for "NoValue" lines, replace with line from hold space
/NoValue$/g

# Store to hold space before printing
h

スクリプトはパラメータを渡すのに十分短いです-e

sed -e '/NoValue$/g' -e h

結果:

Time      Value  Flag
06:15:10  49.95  Actual
06:15:10  49.95  Actual
06:22:50  49.94  Actual
06:23:00  49.93  Actual
06:23:10  49.93  Actual
06:23:20  49.93  Actual
06:23:30  49.93  Actual
06:24:40  49.92  Actual
06:24:40  49.92  Actual

これはNoValue連続した行を最後の行に置き換えますActual。質問はこれについて言及していませんが、要件の合理的な説明のように見えます。

関連情報