Awk ব্যবহার করে কীভাবে কোনও ফাইল স্থান পরিবর্তন করতে হয়? ("সেড-আই" এর মতো)


11

আমার একটি awkস্ক্রিপ্ট রয়েছে new.awk:

 BEGIN { FS=OFS="," }
 NR==1 {
for (i=1; i<=NF; i++) {
    f[$i] = i
}
   } 
  NR > 1 {
 begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"])))
 endSecs = begSecs + $(f["TotalDuration"])
 $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs)
 }
 { print }

আমি এটি শেল কল করছি

awk new.awk sample.csv

... তবে আমি টার্মিনালের পরিবর্তনগুলি দেখতে পাচ্ছি। কীভাবে ফাইলটিতে স্থান পরিবর্তন করতে হয়, যেমন ব্যবহার করার সময় sed -i?

উত্তর:


16

জিএনইউ awk(সাধারণত লিনাক্স সিস্টেমে পাওয়া যায়) সংস্করণ ৪.১.০, কমান্ড লাইনের awkসাথে -iবা " উত্স গ্রন্থাগার" অন্তর্ভুক্ত করতে সক্ষম --include। জিএনইউ দিয়ে বিতরণ করা উত্স গ্রন্থাগারগুলির awkমধ্যে একটি হ'ল inplace:

$ cat file
hello
there
$ awk -i inplace '/hello/ { print "oh,", $0 }' file
$ cat file
oh, hello

আপনি দেখতে পাচ্ছেন, এটি awkকোডের আউটপুটটিকে ইনপুট ফাইলটি প্রতিস্থাপন করে। thereপ্রোগ্রামটি আউটপুট না করায় লাইন উক্তিটি রাখা হয় না।

awkকোনও ফাইলের স্ক্রিপ্ট সহ , আপনি এটির মতো ব্যবহার করবেন

awk -i inplace -f script.awk datafile

যদি awkভেরিয়েবলটি INPLACE_SUFFIXকোনও স্ট্রিংয়ে সেট করা থাকে তবে লাইব্রেরিটি ফাইলের নাম প্রত্যয় হিসাবে এটির সাথে মূল ফাইলটির ব্যাকআপ তৈরি করবে।

awk -i inplace -v INPLACE_SUFFIX=.bak -f script.awk datafile

আপনার যদি বেশ কয়েকটি ইনপুট ফাইল থাকে তবে প্রতিটি ফাইলের সাথে পৃথক পৃথকভাবে স্থান সম্পাদনা করা হবে। তবে আপনি inplace=0সেই ফাইলের আগে কমান্ড লাইন ব্যবহার করে কোনও ফাইলের জন্য (বা ফাইলের একটি সেট) জন্য জায়গা-এ সম্পাদনা বন্ধ করতে পারেন :

awk -i inplace -f script.awk file1 file2 inplace=0 file3 inplace=1 file4

উপরের কমান্ডে, file3জায়গায় জায়গায় সম্পাদনা করা হবে না।


একটি একক ফাইলের আরও পোর্টেবল "ইন-প্লেস এডিট" এর জন্য, ব্যবহার করুন

tmpfile=$(mktemp)
cp file "$tmpfile" &&
awk '...some program here...' "$tmpfile" >file
rm "$tmpfile"

এটি কোনও অস্থায়ী স্থানে ইনপুট ফাইলটি অনুলিপি করবে, তারপরে awkমূল ফাইলের নামটিতে পুনর্নির্দেশের সময় অস্থায়ী ফাইলটিতে কোডটি প্রয়োগ করবে ।

এই ক্রমে ক্রিয়াকলাপগুলি করা ( awkআসল ফাইলে চলমান , মূল ফাইলে নয়) নিশ্চিত করে যে মূল ফাইলটির ফাইল মেটা-ডেটা (অনুমতি এবং মালিকানা) পরিবর্তন করা হয়নি।


4

এটা চেষ্টা কর.

awk  new.awk sample.csv > tmp.csv && mv -f tmp.csv sample.csv
  • আউটপুটটি একটি অস্থায়ী ফাইলে পুনর্নির্দেশ করুন।
  • তারপরে টেম্পল ফাইলের সামগ্রীটি মূল ফাইলে সরান।

1
আপনি যদি অজগর ইনপ্লেস সোর্স কোডটি দেখেন তবে এটি ঠিক এটি করে: এটি একটি অস্থায়ী ফাইল তৈরি করে, সেখানে স্টডআউটকে পুনঃনির্দেশ করে এবং শেষে এটি ইনপুট ফাইলটির নাম পরিবর্তন করে।
সিএইচএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.