फ़ाइल को इन-प्लेस में कैसे सॉर्ट करें


205

जब हम sort fileकमांड का उपयोग करते हैं , तो फ़ाइल अपनी सामग्री को एक क्रमबद्ध तरीके से दिखाती है अगर मैं किसी भी तरह का आउटपुट नहीं चाहता, लेकिन एक सॉर्ट की गई फ़ाइल?


फ़ाइल को छाँटने के परिणाम के साथ आप क्या करना चाहते हैं, यह स्पष्ट रूप से बताने के लिए अपने प्रश्न को अपडेट करें। क्या आप fileएक ही फ़ाइल की छँटाई हुई सामग्री के साथ अनसोल्ड कंटेंट की जगह, इसे छाँटना चाहते हैं? जिस तरह से आपका प्रश्न वर्तमान में कहा गया है, कुछ भी नहीं करना एक सही उत्तर है (आप कोई भी आउटपुट नहीं चाहते हैं, इसलिए कुछ भी न करें)।
कीथ थॉम्पसन

@KeithThompson आपकी चिंता के लिए धन्यवाद वास्तव में, मैं एक फ़ाइल को सॉर्ट करने की कोशिश कर रहा था, लेकिन स्क्रीन पर आउटपुट से बचना चाहता हूं।
अली साजिद

तो आप कहाँ जाना चाहते हैं आउटपुट? एक नई फ़ाइल में? मूल फ़ाइल में? हॉल के नीचे प्रिंटर के लिए?
कीथ थॉम्पसन

1
ओरिगनल फ़ाइल में
अली साजिद

चलाएं sort infile >outfileऔर आपको फ़ाइल "आउटफाइल" में सॉर्ट किए गए आउटपुट मिलेंगे। फिर आप मूल "शिशु" को मिटा सकते हैं और सब कुछ ठीक होगा।
लुइस कोलोराडो

जवाबों:


408

आप सॉर्ट किए गए आउटपुट को रीडायरेक्ट करने के लिए फ़ाइल पुनर्निर्देशन का उपयोग कर सकते हैं:

sort input-file > output_file

या आप उपयोग कर सकते हैं -o, --output=FILEएक तरह से विकल्प एक ही इनपुट और आउटपुट फ़ाइल इंगित करने के लिए:

sort -o file file

नोट: एक सामान्य गलती आउटपुट को उसी इनपुट फ़ाइल (जैसे sort file > file) पर पुनर्निर्देशित करने की कोशिश करना है । यह काम नहीं करता है क्योंकि शेल पुनर्निर्देशन कर रहा है ( सॉर्ट (1) प्रोग्राम नहीं) और इनपुट फाइल (आउटपुट के रूप में भी) को सॉर्ट (1) प्रोग्राम को पढ़ने के अवसर देने से ठीक पहले मिटा दिया जाएगा ।


88
सामान्य गलती पर अच्छा ध्यान दें
Drakes

1
यह वास्तव में काम में आता है जब आपको मैन्युअल रूप से LaTeX, +1
ब्रायसन एस।

6
सिर्फ आदेश के महत्व का उल्लेख करने के लिए। से GNU sortजानकारी पेज: -o OUTPUT-FILE' आउटपुट फ़ाइल के बजाय मानक आउटपुट में --output = आउटपुट फ़ाइल 'उत्पादन लिखें। नई प्रणालियों पर, -o' cannot appear after an input file if POSIXLY_CORRECT 'सेट है, उदाहरण के लिए, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' को अपनी इनपुट फ़ाइलों से पहले।
यासीन एलबाडौई

14
फ़ाइल नाम को दोहराने से बचने के लिए:sort -o file{,}
टेंटनर

65

sortआदेश डिफ़ॉल्ट रूप से मानक आउटपुट में छँटाई आपरेशन के परिणाम प्रिंट करता है। "इन-प्लेस" सॉर्ट को प्राप्त करने के लिए, आप यह कर सकते हैं:

sort -o file file

यह fileसॉर्ट किए गए आउटपुट के साथ इनपुट को ओवरराइट करता है । -oस्विच, एक निर्गम निर्दिष्ट करने के लिए प्रयोग किया जाता है, POSIX द्वारा परिभाषित किया गया है, तो के सभी संस्करण पर उपलब्ध होना चाहिए sort:

-o मानक आउटपुट के बजाय उपयोग की जाने वाली आउटपुट फ़ाइल का नाम निर्दिष्ट करें। यह फ़ाइल इनपुट फ़ाइलों में से एक के समान हो सकती है।

यदि आप स्विच के sortबिना संस्करण के लिए दुर्भाग्यशाली हैं -o( लुइस मुझे विश्वास दिलाता है कि वे मौजूद हैं), तो आप मानक तरीके से एक "इन-प्लेस" संपादित कर सकते हैं:

sort file > tmp && mv tmp file

2
+ ^ सर्वश्रेष्ठ उत्तर के लिए, और अस्पष्ट प्रश्न के साथ भी, लेकिन अभी भी शीर्ष पेज रैंक पर इसलिए बूस्टिंग की आवश्यकता है।
u2n

6
sort file | sponge file

यह निम्नलिखित फेडोरा पैकेज में है:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
यह उबंटू के साथ काम करने के बाद भी काम करता हैsudo apt install moreutils
सर्ज स्ट्रोबंड्ट

4

जगह में फ़ाइल सॉर्ट करने के लिए, कोशिश करें:

echo "$(sort your_file)" > your_file

जैसा कि अन्य उत्तरों में बताया गया है, आप आउटपुट को इनपुट फ़ाइल में वापस रीडायरेक्ट नहीं कर सकते। लेकिन आप sortपहले कमांड का मूल्यांकन कर सकते हैं और फिर इसे मूल फ़ाइल पर वापस भेज सकते हैं। इस तरह आप इन-प्लेस सॉर्ट को लागू कर सकते हैं।

इसी तरह, आप इस ट्रिक को अन्य कमांड पर भी लागू कर सकते हैं जैसे pasteकि पंक्ति-वार अप्लाई करना।


1
यह बुरा है क्योंकि यह बड़ी फ़ाइलों के लिए काम नहीं करेगा, नई कड़ियों को समाप्त करने वाली स्ट्रिप्स, echoPOSIX में बैकस्लैश से बच सकता है, और -oइनपुट के रूप में उसी फ़ाइल के लिए काम करता है: stackoverflow.com/a/29244387-895245
Ciro Santilli will冠状 '冠状

4

यहाँ एक दृष्टिकोण है जो (ab) उपयोग करता है vim:

vim -c :sort -c :wq -E -s "${filename}"

-c :sort -c :wqफ़ाइल को खोलने के बाद यह भाग वीम को आदेश देता है। -Eऔर -sआवश्यक है ताकि विम एक "हेडलेस" मोड में निष्पादित हो जो टर्मिनल पर आकर्षित नहीं होता है।

इसके पास sort -o "${filename}" "${filename}"दृष्टिकोण पर लगभग कोई लाभ नहीं है सिवाय इसके कि यह केवल एक बार फ़ाइल नाम तर्क लेता है।


फाइलों के लिए formatterएक nanorcप्रविष्टि में एक निर्देश लागू करने के लिए यह मेरे लिए उपयोगी था .gitignore। यहाँ है कि मैं उसके लिए इस्तेमाल किया है:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
आप अपने में विम का उपयोग कर रहे हैं nanorc? ओह विडंबना।
ब्रेट होल्मन

2

क्या आप किसी फ़ोल्डर और सबफ़ोल्डर में सभी फाइलों को ओवरराइड करके सॉर्ट करना चाहते हैं?

इसे इस्तेमाल करो:

find . -type f -exec sort {} -o {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.