패턴이 일치하면 전체 행을 이전 행의 데이터(무엇이든)로 바꿉니다.

패턴이 일치하면 전체 행을 이전 행의 데이터(무엇이든)로 바꿉니다.

입력 파일

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 코드는 한 번에 두 줄을 확인하고 첫 번째 줄이 "Actual"로 끝나고 두 번째 줄이 "NoValue"로 끝나는 경우 두 번째 줄이 삭제되고 첫 번째 줄이 그 자리에 채워집니다.
  • 이제 첫 번째 줄(P)을 인쇄하고 삭제한 다음(D) 비어 있지 않은 경우 기존 패턴 공간을 사용하여 sed 코드를 다시 실행합니다.

답변3

이는 단 두 줄의 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. 질문에서는 이에 대해 언급하지 않지만 요구 사항에 대한 합리적인 설명처럼 보입니다.

관련 정보