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スティーブの2番目の答えはさらに慣用的です!):

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

これは、で始まり、To何もない、、minまたはmax、その後にスペースが続く行を探します。一致する行については、デフォルトの出力フィールド区切り文字(スペース)で区切られて、増分された最初のフィールドと2番目のフィールドを印刷します。その後、次の行にスキップします。他のすべての行はそのまま印刷されます(1これはAWKのショートカットです)。

新しい値でファイルを上書きすることはおそらくお勧めできません。値が修正されたかどうかはわかりません...デバイスからファイルを毎回取得する場合、それは当てはまりません。

同じ理由がにも当てはまる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

これが1つの解決策です。「To」、「Tomin」、または「Tomax」で始まり、その後にスペースが続く行については、最初のフィールドを印刷し、次に2番目のフィールドを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 -ion awkはインクルードファイルを追加します。これはsed-iオプションとは異なります。
Stephen Kitt

@StephenKitt:わー!私はそれを知っていました。
スコット

5

Perlのアプローチ:

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

これ-iにより、元のファイルが上書きされるため、何も出力されず、ファイルが直接変更されます。

-a作るには、perlのように振る舞うawkwhitesapce(またはによって与えられた何か他のものへの入力を分割し、-F配列に)@F。したがって、2番目のフィールドは$F[1]、配列が0からカウントを開始するためです。したがって、スクリプトは、2番目のフィールド自体を、で始まる行で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.