आपका सुझाया गया उदाहरण (नीचे) काम नहीं करता है क्योंकि आप वास्तव में एक ही फ़ाइल से पढ़ रहे हैं और एक साथ लिख रहे हैं।
$ cat filename | sort | uniq > filename
एक पाइप या रीडायरेक्ट के साथ विचार यह है कि प्रत्येक पाइप के बाएं और दाएं हाथ की तरफ या रीडायरेक्ट एक साथ समानांतर में चलता है। सही प्रक्रियाओं की जानकारी सूचना कमांड के रूप में इसे बाईं ओर की कमान से सौंपी जाती है, जबकि बाईं ओर की कमान अभी भी चल रही है।
आपके परिदृश्य के काम करने के लिए, फ़ाइल से पढ़ी जाने वाली कमांड को फ़ाइल शुरू होने वाले कमांड से पहले खत्म करने की आवश्यकता होगी। इसे काम करने के लिए आपको आउटपुट को पहले एक अस्थायी स्थान पर पुनर्निर्देशित करना होगा, फिर एक बार यह समाप्त हो जाने के बाद, इसे अस्थायी स्थान से फ़ाइल में वापस भेज दें।
ऐसा करने का एक बेहतर तरीका मूल रूप से आपके पूर्व उदाहरण में है, जहां आप एक अस्थायी फ़ाइल पर रीडायरेक्ट करते हैं, फिर उस फ़ाइल को मूल में वापस नामांकित करें (इसके अलावा आपको फ़ाइल को पहले हटाने की आवश्यकता नहीं है, क्योंकि आगे बढ़ने से किसी भी मौजूदा लक्ष्य को हटा दिया जाता है) ।
$ cat filename | sort | uniq > result
$ mv -f result filename
आप इसे एक स्ट्रिंग चर में भी सहेज सकते हैं, सिवाय इसके कि केवल तभी काम करता है जब डेटा एक बार में सभी मेमोरी में फिट होने के लिए पर्याप्त हो।
echo $(cat filename | sort | uniq > result) > filename
या कुछ और ? बस से गुजरते हुए, मेरे पास इसे आज़माने का समय नहीं है।