টেক্সট ফাইলে sed ​​/ awk / grep কমান্ডের সাহায্যে মানগুলি সম্পাদনা করুন


9

5 বছরের জন্য, আমি একটি আবহাওয়া স্টেশন লা ক্রস ডাব্লুএস 2350 ব্যবহার করি। আবহাওয়া স্টেশন দ্বারা সরবরাহ করা ডেটা আরপিআইতে ওপেন 2300 দিয়ে প্রক্রিয়া করা হয়। এটি খুব ভাল কাজ করে। তবে তাপমাত্রার ডেটাটি মিথ্যা (সেন্সর)। তাপমাত্রার ডেটা 1 ডিগ্রি সেন্টিগ্রেড কম।

যেহেতু আমি সেন্সরটি ক্যালিব্রেট করতে পারি না, তাই আমি আবহাওয়া স্টেশন থেকে প্রাপ্ত ফাইল থেকে তাপমাত্রার মান পরিবর্তন করতে চাই।

এই পাঠ্য ফাইলটিতে (কারেন্ট.টিএসটিএসটি) রয়েছে:

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", "টমিন", "টোম্যাক্স" মানগুলিতে +1 যুক্ত করতে এবং সঠিক মানগুলির সাথে পাঠ্য ফাইলটি ওভাররাইট করতে চাই।

সেড এবং অ্যাজক কমান্ডগুলি দেখার পরে, আমি বুঝতে পারি যে আমি পুরানো। কেউ আমাকে গাইড করতে পারেন? ধন্যবাদ

সম্পাদনা করুন:

আমি অন্য ফাইলটি ভুলে গেছি: 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 দ্বারা বাড়ানো হয় এবং সঠিক মান সহ শেষ লাইনটি ওভাররাইট করা হয়। প্রোগ্রামটি পিএইচপি দ্বারা কেবল শেষ লাইনটি বিবেচনা করা হবে যা কোনও গ্রাফে ফলাফল প্রদর্শন করতে দেয়।

ধন্যবাদ

উত্তর:


12

প্রক্রিয়াজাতকরণের জন্য এখানে আরও কিছুটা আইডোম্যাটিক এডব্লিউ কে বৈকল্পিক দেওয়া হয়েছে current.txt( স্টিভের দ্বিতীয় উত্তরটি আরও বেশি বুদ্ধিমানের!):

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

এটি লাইনগুলি দিয়ে শুরু করে To, কোনও কিছুই অনুসরণ করে না min, বা maxএকটি স্থান অনুসরণ করে; মিলের রেখার জন্য এটি প্রথম ক্ষেত্র এবং দ্বিতীয় ক্ষেত্র প্রিন্ট করে, বর্ধিত, ডিফল্ট আউটপুট ক্ষেত্র বিভাজক (স্পেস) দ্বারা পৃথক। তারপরে এটি পরবর্তী লাইনে চলে যায়। অন্যান্য সমস্ত লাইনগুলি যেমন রয়েছে তেমন মুদ্রিত ( 1এডাব্লুকে-তে এর জন্য একটি শর্টকাট)।

নোট করুন যে নতুন মানগুলির সাথে ফাইলটি ওভাররাইট করা সম্ভবত একটি ভাল ধারণা নয়: মানগুলি সংশোধন করা হয়েছে কিনা তা আপনি জানতে পারবেন না ... আপনি যদি প্রতিবার ডিভাইস থেকে ফাইলটি পুনরুদ্ধার করেন তবে তা প্রয়োগ হয় না।

একই যুক্তি প্রযোজ্য 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

এখানে একটি সমাধান। "টু", "টমিন" বা "টোম্যাক্স" দিয়ে স্পেসের পরে শুরু হওয়া কোনও রেখার জন্য প্রথম ক্ষেত্রটি মুদ্রণ করুন এবং তারপরে দ্বিতীয় ক্ষেত্রটি ১ দ্বারা বাড়ানো হয়েছে Otherwise অন্যথায়, কেবল সম্পূর্ণ লাইনটি মুদ্রণ করুন।

$ 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), তবে আপনি কেবলমাত্র এটি বিদ্যমান বিদ্যমান উত্তরে সম্পাদনা হিসাবে যুক্ত করতে পারতেন!
স্টিফেন কিট

@Scott -iউপর awkযোগ করা একটি ফাইল, এটা মত কিছুই অন্তর্ভুক্ত sed'র -iবিকল্প।
স্টিফেন কিট

@ স্টেফেনকিট: ডিওহ! আমি জানি সেটা.
স্কট

5

একটি পার্ল পদ্ধতির:

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

-iএটা মূল ফাইলটি প্রতিস্থাপন, তাই এটা কিছুই প্রিন্ট আউট হবে, এটি ফাইল সরাসরি পরিবর্তন করতে হবে করে তোলে।

-aতোলে perlমত আচরণ awkwhitesapce তার ইনপুট (অথবা অন্য কিছু কর্তৃক প্রদত্ত, বিভাজন -Fঅ্যারের মধ্যে) @F। সুতরাং, দ্বিতীয় ক্ষেত্রটি হবে $F[1]কারণ অ্যারেগুলি 0 এ গণনা শুরু করে The স্ক্রিপ্টটি দ্বিতীয় ক্ষেত্রটি নিজেই প্রতিস্থাপন করবে যার সাথে শুরু হওয়া লাইনে এক দ্বারা বর্ধিত হবে 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.