sed / awk / grep 명령을 사용하여 txt 파일의 값 편집


9

5 년 동안 기상 관측소 La Crosse WS2350을 사용합니다. 기상 관측소에서 제공하는 데이터는 RPI에서 open2300으로 처리됩니다. 이것은 매우 잘 작동합니다. 그러나 온도 데이터가 잘못되었습니다 (센서). 온도 데이터는 1 ° C 낮습니다.

센서를 교정 할 수 없으므로 기상 관측소에서 추출한 파일에서 온도 값을 변경하고 싶습니다.

이 텍스트 파일 (current.txt)에는 다음이 포함됩니다.

Date 2016-Dec-03
Time 10:30:29
Ti 11.9
Timin 11.6
Timax 27.7
TTin 10:34
DTimin 2016-01-19
TTimax 00:44
DTimax 2016-08-28
To -2.4
Tomin -4.8
Tomax 37.4
TTomin 06:46
DTomin 2016-02-18
TTomax 16:13
DTomax 2016-07-19
...

"To", "Tomin", "Tomax"값에 +1을 추가하고 텍스트 파일을 올바른 값으로 덮어 쓰려고합니다.

sed 및 awk 명령을 살펴본 결과, 나는 구식이라는 것을 알게되었습니다. 누구든지 나를 안내 할 수 있습니까? 감사

편집하다 :

다른 파일을 잊었습니다. ws2308.log 15 분마다 ws2308.log 파일에 새 줄이 추가됩니다.

...
20161203150600 2016-Dec-03 15:06:00 11.8 -1.1 -3.2 65 87 0.0 157.5 SSE -1.1 569.80 1015.700 
20161203152100 2016-Dec-03 15:21:00 12.3 -1.1 -3.2 64 87 0.0 157.5 SSE -1.1 569.80 1015.600 
20161203153600 2016-Dec-03 15:36:00 12.2 -1.2 -3.3 64 87 0.0 135.0 SE -1.2 569.80 1015.700 

수정 될 값은 5 번째 필드 (처음 -1.2)입니다.

마지막 줄에서 온도 값이 1 씩 증가하고 마지막 줄을 올바른 값으로 덮어 써야합니다. 프로그램 php는 마지막 줄만 고려하여 결과를 그래프로 표시 할 수 있습니다.

감사

답변:


12

처리 할 약간 더 관용적 인 AWK 변형이 있습니다 current.txt( 스티브의 두 번째 대답 은 더 관용적입니다!).

awk '/^To(|min|max) / { print $1, $2 + 1; next } 1' current.txt

이것은으로 시작하고 To그 뒤에 아무것도없는 min, 또는 max, 공백이 오는 행을 찾습니다 . 일치하는 행의 경우 기본 출력 필드 구분 기호 (공백)로 구분되어 증가 된 첫 번째 필드와 두 번째 필드를 인쇄합니다. 그런 다음 다음 줄로 건너 뜁니다. 다른 모든 줄은있는 그대로 인쇄됩니다 ( 1AWK에서는 이에 대한 바로 가기입니다).

새 값으로 파일을 덮어 쓰는 것은 좋은 생각이 아닙니다. 값이 수정되었는지 여부를 알 수 없습니다. 매번 장치에서 파일을 검색하면 적용되지 않습니다.

동일한 추론이에 적용 ws2308.log되므로 매번 전체를 처리해 보겠습니다.

$ awk 'NF >= 5 { $5 = $5 + 1 } 1' ws2308.log
20161203150600 2016-Dec-03 15:06:00 11.8 -0.1 -3.2 65 87 0.0 157.5 SSE -1.1 569.80 1015.700
20161203152100 2016-Dec-03 15:21:00 12.3 -0.1 -3.2 64 87 0.0 157.5 SSE -1.1 569.80 1015.600
20161203153600 2016-Dec-03 15:36:00 12.2 -0.2 -3.3 64 87 0.0 135.0 SE -1.2 569.80 1015.700

마지막 줄만 원하는 경우 :

$ awk 'NF >= 5 { $5 = $5 + 1; lastline = $0 } END { print lastline }' ws2308.log
20161203153600 2016-Dec-03 15:36:00 12.2 -0.2 -3.3 64 87 0.0 135.0 SE -1.2 569.80 1015.700

또는 마지막 줄만 변경된 파일을 원할 경우 :

$ awk 'length(prevline) > 0 { print prevline } NF >= 5 { prevline = $0; $5 = $5 + 1; lastline = $0 } END { print lastline }' ws2308.log
20161203150600 2016-Dec-03 15:06:00 11.8 -1.1 -3.2 65 87 0.0 157.5 SSE -1.1 569.80 1015.700 
20161203152100 2016-Dec-03 15:21:00 12.3 -1.1 -3.2 64 87 0.0 157.5 SSE -1.1 569.80 1015.600 
20161203153600 2016-Dec-03 15:36:00 12.2 -0.2 -3.3 64 87 0.0 135.0 SE -1.2 569.80 1015.700

10

한 가지 해결책이 있습니다. "To", "Tomin"또는 "Tomax"로 시작하고 그 뒤에 공백이있는 행의 경우 첫 번째 필드를 인쇄 한 다음 두 번째 필드를 1 씩 증가시킵니다. 그렇지 않으면 전체 행을 인쇄하십시오.

$ awk '{if(/^(To|Tomin|Tomax) /){print $1 " " $2+1}else{print $0}}' w.txt
Date 2016-Dec-03
Time 10:30:29
Ti 11.9
Timin 11.6
Timax 27.7
TTin 10:34
DTimin 2016-01-19
TTimax 00:44
DTimax 2016-08-28
To -1.4
Tomin -3.8
Tomax 38.4
TTomin 06:46
DTomin 2016-02-18
TTomax 16:13
DTomax 2016-07-19
$

5

또 다른 접근 방식은 약간 골프를 쳤다 .

$ awk '/^To/{$2++}1' w.txt
Date 2016-Dec-03
Time 10:30:29
Ti 11.9
Timin 11.6
Timax 27.7
TTin 10:34
DTimin 2016-01-19
TTimax 00:44
DTimax 2016-08-28
To -1.4
Tomin -3.8
Tomax 38.4
TTomin 06:46
DTomin 2016-02-18
TTomax 16:13
DTomax 2016-07-19
$

3
좋았으므로 (+1) 기존 답변의 수정 사항으로 추가했을 수 있습니다!
Stephen Kitt

@Scott -iawk파일과 같은 그것의 아무것도 포함 추가 sed-i옵션을 선택합니다.
Stephen Kitt

@StephenKitt : D' oh! 나는 그것을 알고 있었다.
Scott

5

펄 접근 방식 :

perl -i -ape '/^To/ && s/$F[1]/$F[1]+1/e' file

-i그것이 원본 파일을 덮어 쓰기는 아무것도 출력하지 않게,이 파일을 직접 변경됩니다 수 있습니다.

-a차종은 perl같이 행동 awk분할 (다른 주어진 혹은 아무것도 whitesapce에 입력을 -F배열로) @F. 따라서 두 번째 필드는 $F[1]배열이 0부터 시작하기 때문입니다. 따라서 스크립트는 두 번째 필드 자체를로 시작하는 행에서 1 씩 증가한 것으로 바꿉니다 To.


2

이것은 일을 할 것입니다 :

  1. 먼저 모든 라인을 통과합니다
  2. 그런 다음 첫 번째 항목을 확인하고 원하는 항목과 일치하는지 확인하십시오.
  3. 그런 다음 일치하면 인쇄하여 줄의 다음 항목에 +1을 추가하십시오.
  4. 그렇지 않으면 그냥 인쇄하고 다음 항목을 인쇄하십시오.

    awk '{
        for(i=1;i<=NF;i++) {
                t+=$i;if(i==1){
                        if($i=="To" ||$i=="Tomin" ||$i=="Tomax"  ){
                                printf  "%s ",$i;
                                print $(i+1)+1;}
    
                        else{
                                print $0
                                }
                        }
                        };
        }' current.txt
    

산출

Date 2016-Dec-03
Time 10:30:29
Ti 11.9
Timin 11.6
Timax 27.7
TTin 10:34
DTimin 2016-01-19
TTimax 00:44
DTimax 2016-08-28
To -1.4
Tomin -3.8
Tomax 38.4
TTomin 06:46
DTomin 2016-02-18
TTomax 16:13
DTomax 2016-07-19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.