`সেড - ইন-প্লেস like এর মতো কোনও জায়গায় বাছাই করে কোনও ফাইলকে বাছাই করা সমর্থন করে?


80

আমি অন্ধ বা মত কোনো বিকল্প নেই Am --in-placeজন্য sort?

ইনপুট ফাইলে ফলাফলগুলি সংরক্ষণ করার জন্য, সেড -i( --in-place) ব্যবহার করে ।

sortইনপুট ফাইলে আউটপুট পুনর্নির্দেশ

sort < f > f

এটি খালি করার ফলাফল। যদি কোন হল --in-placeবিকল্প - হয়তো কিছু কৌতুক কিভাবে এই কাজটি করা হয় কুশলী উপায়?

(আমার মনে একটাই কথা এসেছে:

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

স্থানান্তর সঠিক পছন্দ নয়, কারণ ফাইলের অনুমতিগুলি পরিবর্তিত হতে পারে। সে কারণেই আমি টেম্প ফাইলের বিষয়বস্তু দিয়ে ওভাররাইট করি যা আমি তারপরে সরিয়ে ফেলি))


এছাড়াও আছে insitu, কোনও আদেশ ব্যবহার করে ব্যবহারের অনুমতি দেয়।
sr_

@ এসআর_, এটি একটি আকর্ষণীয় কমান্ড, তবে এটি কোনও কমান্ডের সাথে কাজ করে না , কেবল যেগুলি পড়ার চেয়ে দ্রুত লেখেন না (অন্যথায় কমান্ডটি পড়ার আগে এটি ইনপুট ফাইলটি ক্লোবার করবে)। এটি যে কাজ করবে তার কোনও গ্যারান্টি নেই sort
সিজেএম

@ সিজেএম, আমি সত্যিই নিশ্চিত নই, তবে কি এই মামলাটি পরিচালনা করার কথা নয় ?
sr_

@ এসআর_, আমি মনে করি আপনি ঠিক বলেছেন উত্সের দিকে তাকানোর পরিবর্তে আমি বিবরণটি পড়ি। যদিও সত্যিই বড় ফাইলগুলির জন্য, এটি বাফার এবং ক্র্যাশের জন্য স্মৃতিশক্তি থেকে সরে যেতে পারে (এটি ম্যালোক থেকে NULL ফেরতের জন্য দেখে মনে হচ্ছে না)।
সিজেএম

@ সিজেএম: ওহ হ্যাঁ, সত্যিই।
sr_

উত্তর:


110

sort-o, --outputযুক্তি হিসাবে একটি ফাইল নাম গ্রহণ করে এমন বিকল্প রয়েছে । যদি এটি ইনপুট ফাইলের মতো হয় তবে এটি ফলকে একটি অস্থায়ী ফাইলে লিখবে, তারপরে মূল ইনপুট ফাইলটি ওভাররাইট করে (ঠিক কী একইভাবে কাজ sed -iকরে)।

GNU sortতথ্য পৃষ্ঠা থেকে :

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

এবং ওপেন গ্রুপ বেস স্পেসিফিকেশন ইস্যু 7 থেকে :

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.

হুবহু! এটি কাজ করে! আমি এটি সম্পর্কে কোনও ক্লু দেখতে পাচ্ছি না man sort- এটি কি অনিবন্ধিত বৈশিষ্ট্য? এটি কি স্ট্যান্ডার্ড এবং পোর্টেবল?
গ্রেজগোর্জ ওয়েয়ারজোইইকি

@ গ্রজেগোর্জওয়ায়ারজোইইকি: আপডেট দেখুন।
enzotib


1
সংক্ষেপে: sort -o <filename> <filename>নিরাপদে জায়গায় একটি ফাইল বাছাই করা হবে।
ফায়াত

11

আপনি এই spongeফাংশনটি ব্যবহার করতে পারেন , এটি প্রথমে ভিজিয়ে রাখে stdinএবং তারপরে একটি ফাইলে লিখবে , যেমন:

sort < f | sponge f

এর নেতিবাচক দিকটি spongeহ'ল এটি আউটপুটটিকে অস্থায়ীভাবে মেমরিতে সঞ্চয় করবে যা বড় ফাইলগুলির জন্য সমস্যাযুক্ত হতে পারে। অন্যথায় আপনাকে এটিকে প্রথমে কোনও ফাইলে লিখতে হবে এবং তারপরে মূল ফাইলটি ওভাররাইট করতে হবে।

যেমনটি অন্যান্য উত্তরের দ্বারা চিহ্নিত করা হয়েছে, জায়গায় পরিবর্তনগুলি সাধারণত একটি ভাল ধারণা নয়, যেহেতু একটি প্রক্রিয়াটির মাঝামাঝি সময়ে (উদাহরণস্বরূপ spongeএক), মেশিনটি ক্র্যাশ হতে পারে এবং তারপরে আপনি মূল এবং নতুন ফাইল উভয়ই হারাতে পারেন। আপনি প্রথমে এটি আলাদা কোনও ফাইলে লিখুন এবং তারপরে একটি পারমাণবিক mv(সরানো) নির্দেশনা ব্যবহার করুন।


7

আউটপুট ফাইলের সাথে ইনপুট ফাইলটি ওভাররাইট করা বিপজ্জনক, কারণ ফাইলটি লেখার সময় যদি প্রোগ্রাম বা সিস্টেমটি ক্র্যাশ হয়ে যায় তবে আপনি উভয়ই হারিয়েছেন।

কয়েকটি প্রোগ্রামের (বেশিরভাগ জিএনইউ সংস্করণ) একটি স্থানের বিকল্প রয়েছে (যেমন -iপার্ল এবং জিএনইউ সেডের -oউপর ; জিএনইউ সাজানোর ক্ষেত্রে)। তারা অস্থায়ী ফাইলে ডেটা স্থাপন করে এবং এটিটিকে জায়গায় স্থানান্তরিত করে কাজ করে। যে প্রোগ্রামগুলির কাছে এ জাতীয় কোনও বিকল্প নেই, কলিন ওয়াটসনের spongeইউটিলিটি ( জোয়ে হেসের মুর্টিলগুলিতে অন্তর্ভুক্ত ) কোনও প্রোগ্রামের জন্য নিরাপদে কাজ করে (উদাহরণস্বরূপ : আমি কি cutএকটি ফাইল পরিবর্তন করতে পারি ?? কীভাবে রূপান্তরকারীদের সাথে ইনপুট ফাইলটি প্রতিস্থাপন করতে পারি ? ) আউটপুট? )।

কেবলমাত্র সেই বিরল ক্ষেত্রেই যেখানে আপনি একই অনুমতি নিয়ে মূল ফাইলটি পুনরায় তৈরি করতে পারবেন না আমি সেই জায়গায় ফাইলটি ওভাররাইটিংয়ের পরামর্শ দিই। এই ক্ষেত্রে, আপনি ভাল কোথাও মূল ইনপুট সংরক্ষণ করতে চান। এবং তারপরে আপনি কেবল ইনপুটটির অনুলিপিটি প্রক্রিয়া করতে পারেন এবং এটি মূল ফাইলে প্রেরণ করতে পারেন।

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

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

এবং প্রকৃতপক্ষে, এটি এমন একটি ক্ষেত্রে যেখানে জিএনইউ sortপসিক্স না যেমন sort -mo file1 file1 file2কাজ করার গ্যারান্টিযুক্ত না হয় যখন traditional sortতিহ্যবাহীরা কীভাবে এটি কাজ করতে জানেন (70 এর দশকে ইউনিক্স ভি 7 এ প্রসারিত)।
স্টাফেন চেজেলাস

@ জোয়েলক্রস অদ্ভুত, কোরিউটিলস sort -o৮.২৫ নিয়ে আমার জন্য কাজ করে এবং সম্পত্তিটি ম্যানুয়ালটিতে নথিবদ্ধ হয় (লক্ষ্য করা যায় যে এটি বাছাইয়ের সময় কেবল ক্ষেত্রে হয়, মার্জ করার সময় নয়)। আপনি যদি এটি পুনরুত্পাদন করতে পারেন তবে একটি বাগ রিপোর্ট পাঠান (সঠিক কমান্ড লাইন, সঠিক ইনপুট ফাইল (গুলি), আপনি কোন সিস্টেমে এটি চালাচ্ছেন এবং আপনি কীভাবে বাইনারিটি পেয়েছেন তা নির্দেশ করুন) send
গিলস

4

-oভিম-ওয়ে ব্যবহার করুন বা চেষ্টা করুন:

$ ex -s +'%!sort' -cxa file.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.