অনন্য বাছাই: একই ফাইলে আউটপুট পুনর্নির্দেশ


14

পাইপ আউটপুটটি প্রক্রিয়াজাত করা একই ফাইলটিতে সংরক্ষণ করার কোনও সংক্ষিপ্ত উপায় আছে কি? উদাহরণস্বরূপ, আমি আসলে এটিই করছি

$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename

আমি ভাবছিলাম যে এটি কেবলমাত্র একটি লাইনে করার কোনও উপায় ছিল (&& ব্যবহার করে এই আদেশগুলি সংযোজন না করে)

এই উপায় নয়, একটি ধারণা পেতে

$ cat filename | sort | uniq > filename

2
echo $(cat filename | sort | uniq > result) > filenameঅথবা অন্যকিছু ? কেবল পাশ কাটিয়ে আমার চেষ্টা করার সময় নেই to
মিঃ ভাইকাদজি

উত্তর:


18

আপনি Moreutils প্যাকেজ spongeথেকে ব্যবহার করতে পারেন :

LC_ALL=C sort -u filename | sponge filename

এছাড়াও আপনি নল প্রয়োজন হবে না uniq, যখন থেকে sortহয়েছে -uঅনন্য লাইনে বিকল্পটি বাছাই।

নোট করুন যে ইউএনএফ -8 স্থানীয় লোকাল সহ জিএনইউ সিস্টেমে, sort -uবা sort | uniqআপনাকে অনন্য লাইন দেয়নি, তবে লাইনের ক্রম থেকে প্রথমটি যা বর্তমান লোকালে একই সারণি করে।

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=en_US.utf8 sort | LC_ALL=en_US.utf8 uniq

শুধুমাত্র আপনার দেওয়া । লোকেলে সি তে পরিবর্তন করা বাইট মানগুলির উপর ভিত্তি করে বাছাইয়ের আদেশটিকে বাধ্য করে:

$ export LC_ALL=C
$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C sort | LC_ALL=C uniq


12

তোমার মত কোন অতিরিক্ত কমান্ড প্রয়োজন হবে না catএবং uniqএছাড়াও ব্যবহার না করেই rmকমান্ড mvঅপসারণ এবং ফাইলের নাম পুনঃনামকরনের আদেশ করুন। সহজ কমান্ড ব্যবহার করুন।

sort -u filename -o filename


 -u, --unique
        with -c, check for strict ordering; without -c, output only  the
        first of an equal run

 -o, --output=FILE
        write result to FILE instead of standard output

এটি কিভাবে কাজ করে?

sortকমান্ড আপনার ফাইলের নাম বাছাই করে এবং -uবিকল্প সহ, এটি থেকে সদৃশ লাইনগুলি সরিয়ে দেয়। তারপরে -oবিকল্পের সাথে একই পদ্ধতিতে স্থান পদ্ধতিতে আউটপুট লিখুন।


3
যদি sortচলমান অবস্থায় সিস্টেম ক্র্যাশ হয় তবে আপনি আপনার আসল ফাইলটি আলগা করবেন।
cuonglm

@ জ্ঞাক তাই, এটি দুর্ভাগ্যের সমাপ্তি !! : '(
সিস

1
ধন্যবাদ! এই উদাহরণে, বিশেষত ´সোর্ট´-এর সাথে আমার এটি করা উচিত। তবে আমি একটি সাধারণ কেস নিয়ে ভাবছিলাম। @ জ্ঞাক, হাহা ভাবার উপায় নেই যে যদি তা আপনার সাথে না ঘটে থাকে, তাই না?
হোয়াইটনয়েজড

3

আপনার প্রস্তাবিত উদাহরণটি (নীচে) কাজ করে না কারণ আপনি একই সাথে একই ফাইল থেকে পড়তে এবং লিখতে চাইছেন।

$ cat filename | sort | uniq > filename

একটি পাইপ বা পুনঃনির্দেশ সহ ধারণাটি হ'ল প্রতিটি পাইপের বাম এবং ডানদিকে কমান্ডটি সমান্তরালভাবে একই সাথে চালিত হয়। বাম দিকের কমান্ডটি যখন বাম দিকের কমান্ডটি চলমান রয়েছে তখন ডান দিকের কমান্ড তথ্য প্রসেস করে।

আপনার দৃশ্যের কাজ করার জন্য, ফাইল থেকে পড়া কমান্ডটি ফাইলটিতে লেখা কমান্ডটি শুরু হওয়ার আগে শেষ করা উচিত। এটি কাজ করার জন্য আপনাকে প্রথমে আউটপুটটিকে একটি অস্থায়ী স্থানে পুনর্নির্দেশ করতে হবে, তারপরে এটি শেষ হয়ে গেলে অস্থায়ী অবস্থান থেকে ফাইলটিতে ফিরে পাঠাতে হবে।

এটি করার একটি আরও ভাল উপায় মূলত আপনার পূর্ববর্তী উদাহরণের মতো, যেখানে আপনি কোনও অস্থায়ী ফাইলে পুনর্নির্দেশ করেন তারপরে সেই ফাইলটির পুনরায় নামকরণ করুন মূলটিকে (আপনার প্রথমে ফাইলটি মুছতে হবে না, কারণ সরানো কোনও বিদ্যমান লক্ষ্য মুছে ফেলে) ।

$ cat filename | sort | uniq > result
$ mv -f result filename

আপনি এটিকে স্ট্রিং ভেরিয়েবলেও সংরক্ষণ করতে পারেন, কেবলমাত্র তখনই কাজ করা হয় যখন ডেটা একবারে মেমরির জন্য উপযুক্ত পরিমাণে যথেষ্ট পরিমাণে হয়।


হিসাবে কেউ একটি প্রস্তাবিত সম্পাদনা আউট করা, আপনি পরিবর্তন করতে পারেন cat filename | sortমাত্র sort filename- catএখানে অপ্রয়োজনীয়।
থোমাসরুটটার

আমার নীচের উদাহরণটি এটি করার উপায় ছিল না। বিবৃতির জন্য ধন্যবাদ. catএই ক্ষেত্রে অপ্রয়োজনীয় হতে পারে তবে আমি পুনর্নির্দেশের অংশটির দিকে মনোনিবেশ করছিলাম।
হোয়াইটনয়েসাইড

1
আমি ব্যাখ্যা করছিলাম কেন আপনার নীচের উদাহরণটি কাজ করবে না। আমি জানি আপনি জানেন যে এটি কাজ করে না।
থোমাসরুটটার

স্পষ্ট করার জন্য ধন্যবাদ! আসলে আমি জানতাম না আসলে কী হচ্ছে।
হোয়াইটনয়েসাইড

2

আপনি teeকমান্ডটি ব্যবহার করতে পারেন :

sort -u filename | tee filename > /dev/null

teeকমান্ড স্ট্যান্ডার্ড ইনপুট থেকে পড়ে এবং মানক আউটপুটে লিখেছেন এবং ফাইল।


2
এটি আমার পক্ষে কাজ করে না।
pjvandehaar


এটি আমার পক্ষে কাজ করে । উদাহরণস্বরূপ, একটি ফাইলের নীচে একটি লাইন সরানো: (cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/nullকাজ করে। আসল পোস্টের মতো, আপনি যদি কেবলমাত্র > ~/fileএটি ছাড়া না করেন তবে এটি কাজ করে না tee। টি এখানে এখানে অনুরূপ বলে মনে হচ্ছে sort -o file, যা একই পাইপটি চালিয়ে না রেখে নাম লেখানো ফাইলটিতে লিখে।
জোশুয়া গোল্ডবার্গ

অপেক্ষা করুন, দুঃখিত! আমি অভিজ্ঞতার সাথে দেখেছি এটি @ স্টিভেনের লিঙ্কে বর্ণিত তথ্য হিসাবে অনাকাঙ্ক্ষিতভাবে হারাবে। 9 লাইনে 1..9 নম্বর দিয়ে একটি ফাইল তৈরি করুন। নিম্নলিখিতগুলি বেশ কয়েকবার কাজ করবে এবং তারপরে মাঝেমধ্যে ফাইল থেকে সমস্ত ডেটা সরিয়ে ফেলবে: (cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x আমি একটি অস্থায়ী ফাইল এবং mvসম্ভবত @ স্টিভেনের লিঙ্ক থেকে সমাধানের প্রস্তাব দিই ।
জোশুয়া গোল্ডবার্গ

@ জোশুয়া গোল্ডবার্গ আপনি কি এই উত্তরটিতে আমার উত্তরটি দেখেছেন?
স্টিভেন পেনি

0

আপনি প্রাক্তন মোডে ভিম ব্যবহার করতে পারেন:

ex -sc 'sort u|x' filename
  1. sort u অনন্য সাজান

  2. x পরিবর্তনগুলি করা হয়েছে (তাদের আছে) এবং ছেড়ে দিলে লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.