Text-Processing

如何用上一行的數據替換沒有數據的行

  • December 20, 2021

輸入

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”的行。時間將替換為上次記錄的時間,增量為 10 秒(10 秒) 值將替換為上次記錄的時間 標誌將替換為實際

我的結果將顯示為,

Time      Value  Flag
06:15:10  49.95  Actual
06:15:20  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:50  49.92  Actual
awk -F'[: ]+' -v addSec=10 '
NR>1 && /Actual/{
    sec=(($1*3600)+($2*60)+$3) +addSec;
    prevTime=sprintf("%02d:%02d:%02d", sec/3600, sec%3600/60, sec%60) OFS $4 OFS $5;
}
/NoValue/{ $0=prevTime }1
' infile

嘗試這個:

貓小說 | tr -s " " | awk -F"

$$ : $$" -f val.awk 在哪裡:

cat noval 
06:15:10  49.95  Actual
00:00:00  0.00  
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  

cat val.awk
{
   if($5=="") {
       print g
                  }
       else {
              print $0
          $3=$3+10
              if ($3>59){
       $3=$3-60
       $2=$2+1
              }
              if ($2>59){
                 $2=$2-60
                 $1=$1+1
              }
if(length($1)<2) {$1="0"$1}
if(length($2)<2) {$2="0"$2}
if(length($3)<2) {$3="0"$3}
              g=$1":"$2":"$3" "$4" "$5
             }
}

結果是:

06:15:10 49.95 Actual
06:15:20 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:50 49.92 Actual

注意:使用 awk 我們沿著字元冒號 (:) 和空格分解每一行。這樣我們就可以訪問時間戳的三個組件(第 1、2、3 列),以便可能添加 10。我們使用 tr 將多個空格壓縮為一個。awk 中的 F 標誌設置為沿冒號和/或空間分解行以進行操作。

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