Awk সহ জায়গায় পরিবর্তনগুলি সংরক্ষণ করুন


135

আমি শিখছি awkএবং আমি এটির মতো ফাইলগুলিতে পরিবর্তনগুলি লেখার বিকল্প আছে কিনা তা জানতে চাইsed যেখানে আমি -iকোনও ফাইলে পরিবর্তনগুলি সংরক্ষণ করার জন্য বিকল্পটি ব্যবহার করব

আমি বুঝতে পারি যে পরিবর্তনগুলি লিখতে আমি পুনঃনির্দেশ ব্যবহার করতে পারি। যাইহোক এটি করতে একটি বিকল্প আছে awk?


আরো দেখুন serverfault.com/a/547331/313521 "ফেরৎ সহ জায়গার একটি ফাইল সম্পাদনা করা" আরও সাধারণ উত্তরের জন্য।
ওয়াইল্ডকার্ড

@Wildcard। সমাধানটি ভয়াবহভাবে ভঙ্গুর। ইভেন্টের ক্রম সম্পর্কিত কোনও গ্যারান্টি নেই, এবং সেই সমাধানটি ব্যবহার করা আপনার ডেটা কেটে ফেলতে পারে। অন্যদিকে, আমি সরাসরি সেই সাইটে মন্তব্য করতে পারি না কারণ এটি করার জন্য আমার সেই সাইটে 50 টি রেপ দরকার। আমি কখনই বুঝতে পারি না যে কেন ইউনিক্স / লিনাক্স এবং সার্ভার অ্যাডমিনে বিভক্ত হয়ে গেছে, ইত্যাদি। আইএমও, এটি একটি ভুল ছিল।
উইলিয়াম পার্সেল

@ উইলিয়াম পার্সেল, "ইভেন্টের ক্রমানুসারে কোনও গ্যারান্টি নেই" - এটি আসলে মিথ্যা। সমাধানের একমাত্র ভঙ্গুরতা হ'ল যদি সামগ্রীর দৈর্ঘ্য কোনও কমান্ডের সর্বাধিক দৈর্ঘ্যের চেয়ে বড় হয়। ইভেন্টের ক্রমটি অবশ্য গ্যারান্টিযুক্ত।
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড কোন মানটি এই আদেশের গ্যারান্টি দেয়?
উইলিয়াম পার্সেল

@ উইলিয়াম পার্সেল এটি বাশ ডকুমেন্টেশন দ্বারা গ্যারান্টিযুক্ত। অন্যান্য শাঁসের জন্য আমি জানি না। (যাইহোক, আপনি যদি নিজের অ্যাকাউন্টে লিঙ্ক করেন তবে আপনার কাছে 100 টি প্রতিনিধি সমিতির বোনাস থাকবে এবং মন্তব্য করতে সক্ষম হবেন))
ওয়াইল্ডকার্ড

উত্তর:


142

সর্বশেষ জিএনইউ অ্যাউক-এ ( ৪.১.০ প্রকাশিত হওয়ার পরে ) এর মধ্যে "ইনপ্লেস" ফাইল সম্পাদনা করার বিকল্প রয়েছে :

[...] নতুন সুবিধা ব্যবহার করে নির্মিত "ইনপ্লেস" এক্সটেনশনটি জিএনইউ sed -iবৈশিষ্ট্যটি অনুকরণ করার জন্য ব্যবহার করা যেতে পারে । [...]

ব্যবহারের উদাহরণ:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

ব্যাকআপটি রাখতে:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3

1
@ সুডো_ও - "অন্তর্নিহিত" বিক্ষোভের জন্য ধন্যবাদ। আপনার উত্তর upvated!
ল্যান্ড

দেখে মনে হচ্ছে বিকল্পটি কি সরিয়ে দেওয়া হয়েছে? ৪.১.৩ সহ আমার "-i অন্তর্ভুক্তি
কীথ হুগিট

1
@ কিথ আমার একই প্রশ্ন ছিল। আমি এটি চেষ্টা করেছি এবং এটি আমার 4.1.3 এ কাজ করে। আইআইসিমুরের উত্তর অনুসারে inplaceআসলে একটি লাইব্রেরি অন্তর্ভুক্ত থাকে , তাই এটির হিসাবে অন্তর্ভুক্ত করা যায় এমন কিছু । gawkinplaceincludefile
cxw

এখানে একটি গুরুত্বপূর্ণ সতর্কতা: 'দেখেছে' অ্যারে কমান্ডের মধ্যে থাকা সমস্ত ফাইলের সদৃশ লাইন পূরণ করবে। সুতরাং যদি প্রতিটি ফাইলের যেমন একটি সাধারণ শিরোনাম থাকে তবে তা প্রথম ফাইলটির পরে প্রতিটি ফাইলে সরানো হবে। পরিবর্তে আপনি যদি প্রতিটি ফাইল স্বাধীনভাবে চিকিত্সা করতে চান তবে আপনাকে চ। * টেক্সটে এর মতো কিছু করতে হবে; do gawk -i insert '! [[$ 0] ++' "$ f"; সম্পন্ন
নিক কে 9

136

আপনার জিএনইউ অবধি 4.1.0 বা তার পরে না থাকলে ...

আপনার কাছে সেডের বিকল্পের মতো -iবিকল্প নেই তবে এর পরিবর্তে করুন:

$ awk '{print $0}' file > tmp && mv tmp file

দ্রষ্টব্য: এটি -iযাদু নয়, এটি একটি অস্থায়ী ফাইলও তৈরি করছে sedকেবল এটি আপনার জন্য পরিচালনা করে।


জিএনইউ অবাক ৪.১.০ ...

GNU awk4.1.0 সংস্করণে এই কার্যকারিতা যুক্ত করেছে ( 10/05/2013 প্রকাশিত হয়েছে) । এটি -iপ্রকাশিত নোটগুলিতে বর্ণিত বিকল্পটি দেওয়ার মতো সরল ফরোয়ার্ড নয় :

নতুন -i বিকল্পটি (xgawk থেকে) awk লাইব্রেরি ফাইল লোড করার জন্য ব্যবহৃত হয়। এটি প্রথম-অপ-বিকল্পের যুক্তিকে স্ক্রিপ্ট হিসাবে বিবেচনা করা হয় - -তে এটির থেকে পৃথক।

inplace.awkএক্সটেনশনটি সঠিকভাবে অনুরোধ করতে আপনাকে বান্ডিলযুক্ত অন্তর্ভুক্ত ফাইলটি ব্যবহার করতে হবে :

$ cat file
123 abc
456 def
789 hij

$ gawk -i inplace '{print $1}' file

$ cat file
123
456
789

পরিবর্তনশীল INPLACE_SUFFIXএকটি ব্যাকআপ ফাইলের জন্য এক্সটেনশন নির্দিষ্ট করতে ব্যবহার করা যেতে পারে:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file

$ cat file
123
456
789

$ cat file.bak
123 abc
456 def
789 hij

আমি আনন্দিত এই বৈশিষ্ট্যটি যুক্ত করা হয়েছে তবে আমার কাছে, প্রয়োগটি খুব উদ্ভট নয় কারণ ভাষার সংক্ষিপ্ততা থেকে শক্তি আসে এবং -i inplace8 টি অক্ষর খুব দীর্ঘ ইমো হয়

অফিসিয়াল শব্দের জন্য ম্যানুয়ালটির একটি লিঙ্ক এখানে ।


আপনার 'প্রথম' উদাহরণটি আরও বেশি হওয়া উচিত নয় : awk '{ gsub(/foo/, "bar" ) } ; { print $0 }' file > tmp.txt && mv -v tmp.txt file?
টনি বারগানস্কি

আমার অবাক করার বিষয়, এপ্রিল ২০১২ পর্যন্ত, এখনও ৪.০.২। কাউকে আপনাকে এ জাতীয় কিছু বলতে দেবেন না এবং এ জাতীয় সংস্করণ উপলব্ধ থাকবে।
জন লুঞ্জার

থেকে awk '{print $0}' file | sponge fileব্যবহার করে লিট্ট খাটো । spongemoreutils
brablc

15

@ সুডো_ও এর সঠিক উত্তর আছে

এটি কাজ করতে পারে না:

someprocess < file > file

শেলটি কিছু প্রসেসের ( পুনর্নির্দেশগুলি ) নিয়ন্ত্রণের আগে পুনর্নির্দেশগুলি সম্পাদন করে । ফেরৎ শূন্য আকার (ফাইল অগ্রভাগ ছাঁটিয়া হবে পুনঃনির্দেশ আউটপুট )। সুতরাং, যেহেতু কোনও সময় প্রসেস শুরু হয়ে যায় এবং ফাইলটি পড়তে চায়, তখন এটি পড়ার কোনও ডেটা নেই।>


14

কাজ করে যে সামান্য হ্যাক

echo "$(awk '{awk code}' file)" > file

একটি যাদুমন্ত্র মত কাজ করে! তবে কি অজমান্ড কমান্ডটি ভেরিয়েবলে সংরক্ষণ করা এবং কেবল আপনার নিফটি ট্রিকটিতে এটি ব্যবহার করা সম্ভব?
আশরাশমুন

13

একটি বিকল্প ব্যবহার করা হয় sponge:

awk '{print $0}' your_file | sponge your_file

যেখানে আপনি '{print $0}'আপনার awk স্ক্রিপ্ট এবং your_fileযে ফাইলটি সম্পাদন করতে চান তার নাম দ্বারা প্রতিস্থাপন করুন ।

sponge ফাইলটিতে সংরক্ষণের পূর্বে সম্পূর্ণ ইনপুটটি শোষণ করে।


স্পঞ্জ কতটা স্ট্যান্ডার্ড / পোর্টেবল?
টমাস

2
spongeএর অংশ moreutils। সুতরাং এটি বেশিরভাগ সিস্টেমে ডিফল্টরূপে উপস্থিত হবে না। তবে দেখে মনে হচ্ছে কমপক্ষে spongeনিজেই যথেষ্ট পরিমাণে বহনযোগ্য এবং প্রায় সর্বত্র চালানো যেতে পারে।
মার্সফট

1
teeবেসডের সাথে তুলনা করা এই সমাধানটির খারাপ দিকটি হ'ল spongeর্যামের কাছে সবকিছু লেখার আগে পড়বে, তাই এটি বড় ফাইলগুলিতে হিম হয়ে যাবে।
মার্সফট


3

আপনি যদি কোনও অস্থায়ী ফাইল তৈরি না করে একটি সংস্করণ সমাধান চান এবং সংস্করণ সহ ব্যবহারযোগ্য! = (গাব 4.1.0):

awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file

4
কিন্তু এই পুরো ফাইলটি মেমোরিতে বাফার করে? একটি 20 গিগাবাইট ফাইল বিবেচনা করুন।
অমিত নাইডু

0

টি ব্যবহার করে

 awk '{awk code}' file | tee file

teeকমান্ড নিতে স্থান ও পরে মৃত্যুদন্ড কার্যকর awkকমান্ড কারণে সমাপ্ত হয় |


5
এটি ভুল। দুটি কমান্ড সমান্তরালভাবে সম্পাদন করা হয় এবং তাত্ক্ষণিকভাবে পাইপ জুড়ে ডেটা প্রবাহিত হয়। বাফারের চেয়ে বড় যে কোনও ফাইল (আমার মেশিনে 8192 বাইট) কেটে যাবে এবং আপনি ডেটা হারাবেন।
ট্রিপ ফ্ল্যাগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.