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