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.