入力ファイル
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
。質問はこれについて言及していませんが、要件の合理的な説明のように見えます。