क्या सॉर्ट समर्थन फ़ाइल को इन-प्लेस में सॉर्ट करता है, जैसे 'sed --in-place'?


80

मैं अंधा या वहाँ की तरह कोई विकल्प नहीं है हूँ --in-placeके लिए sort?

इनपुट फ़ाइल के परिणामों को बचाने के लिए, sed का उपयोग करता है -i( --in-place)।

sortइनपुट फ़ाइल के आउटपुट को पुनर्निर्देशित करना

sort < f > f

परिणाम यह खाली करने में। यदि कोई --in-placeविकल्प नहीं है - हो सकता है कि कुछ ट्रिक हो तो इसे आसान तरीके से कैसे किया जाए ?

(केवल एक चीज जो मेरे दिमाग में आती है:

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

स्थानांतरण सही विकल्प नहीं है, कारण फ़ाइल अनुमतियां बदली जा सकती हैं। इसलिए मैं अस्थायी फ़ाइल की सामग्री को अधिलेखित करता हूं जिसे मैं तब हटाता हूं।)


वहाँ भी है insitu, किसी भी आज्ञाओं को जगह में उपयोग करने की अनुमति देता है।
sr_

@ एसआर_, यह एक दिलचस्प कमांड है, लेकिन यह किसी भी कमांड के साथ काम नहीं करता है , केवल वे ही तेजी से पढ़ते हैं जो लिखते हैं (अन्यथा यह कमांड को पढ़ने से पहले इनपुट फ़ाइल को क्लोब कर देगा)। इसकी कोई गारंटी नहीं है कि यह साथ काम करेगा sort
cjm

@cjm, मैं वास्तव में निश्चित नहीं हूं, लेकिन क्या यह उस मामले को संभालने वाला नहीं है ?
sr_

@ एसआर_, मुझे लगता है कि आप सही हैं। मैंने स्रोत को देखने के बजाय विवरण पढ़ा। यद्यपि वास्तव में बड़ी फ़ाइलों के लिए, यह बफर और क्रैश के लिए मेमोरी से बाहर हो सकता है (ऐसा नहीं लगता है कि यह मॉल से एक पूर्ण वापसी के लिए जांच करता है)।
cjm

@ cjm: ओह हाँ, वास्तव में।
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- क्या यह अनिर्दिष्ट सुविधा है? क्या यह मानक और पोर्टेबल है?
ग्रेज़गोरज़ विर्ज़ोवेकी

@GrzegorzWierzowiecki: अपडेट देखें।
enzotib


1
संक्षेप में: sort -o <filename> <filename>सुरक्षित रूप से एक फ़ाइल को जगह में सॉर्ट करेगा।
फ्यट

11

आप spongeफ़ंक्शन का उपयोग कर सकते हैं , जो पहले सोखता है stdinऔर फिर इसे फ़ाइल में लिखता है, जैसे:

sort < f | sponge f

नकारात्मक पक्ष spongeयह है कि यह आउटपुट को मेमोरी में अस्थायी रूप से संग्रहीत करेगा, जो बड़ी फ़ाइलों के लिए समस्याग्रस्त हो सकता है। अन्यथा आपको इसे पहले एक फ़ाइल पर लिखना होगा और फिर मूल फ़ाइल को ओवरराइट करना होगा।

हालाँकि, अन्य उत्तरों द्वारा बताया गया है, कि जगह में संशोधन आम तौर पर एक अच्छा विचार नहीं है, क्योंकि एक प्रक्रिया के बीच में (उदाहरण के लिए sponge), मशीन दुर्घटनाग्रस्त हो सकती है और फिर आप मूल और नई फ़ाइल दोनों को खो सकते हैं। आप पहले इसे एक अलग फ़ाइल में लिखते हैं और फिर एक परमाणु mv(चाल) निर्देश का उपयोग करते हैं।


7

आउटपुट फ़ाइल के साथ इनपुट फ़ाइल को अधिलेखित करना खतरनाक है, क्योंकि यदि फ़ाइल लिखे जाने के दौरान प्रोग्राम या सिस्टम क्रैश हो जाता है, तो आप दोनों को खो चुके हैं।

कुछ कार्यक्रमों (ज्यादातर GNU संस्करणों) में एक जगह का विकल्प होता है (उदाहरण के -iलिए perl और GNU sed; -oGNU सॉर्ट पर)। वे एक अस्थायी फ़ाइल में डेटा डालकर काम करते हैं और फिर इसे जगह में स्थानांतरित करते हैं। कार्यक्रमों में ऐसी कोई विकल्प होता है कि के लिए, कॉलिन वाटसन की spongeउपयोगिता (में शामिल जॉय हेस के moreutils ) किसी भी प्रोग्राम (उदाहरण के लिए सुरक्षित रूप से काम करता है: मैं कर सकता हूँ cut? जगह में एक फ़ाइल को बदलने , मैं iconv परिवर्तित साथ इनपुट फ़ाइल की जगह कैसे बना सकते हैं आउटपुट? )।

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

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

1
sort -oजीएनयू विशिष्ट नहीं है, और विशेष रूप से फ़ाइल को जगह में बदलने के लिए डिज़ाइन किया गया है। sortअपना इनपुट पूरी तरह से पढ़ने से पहले अपना आउटपुट लिखना शुरू नहीं कर सकता है (डेटा को स्टोर करने के लिए मेमोरी या अस्थायी फ़ाइलों का उपयोग करता है), इसलिए यह काफी स्वाभाविक रूप से आता है कि यह अपने इनपुट को ओवरराइड करने में सक्षम होना चाहिए।
स्टीफन चेज़लस

और वास्तव में, यह एक ऐसा मामला है जहां GNU sortPOSIX नहीं है क्योंकि sort -mo file1 file1 file2काम करने की गारंटी नहीं है, जबकि पारंपरिक sortको पता है कि कैसे काम करना है (70 के दशक में यूनिक्स V7 में)।
स्टीफन चेज़लस 15

@JoelCross Odd, sort -oमेरे लिए 8.25 कोरुटिल्स के साथ काम करता है और संपत्ति को मैनुअल में प्रलेखित किया जाता है (यह देखते हुए कि यह केवल मामला है जब छंटनी होती है, जब विलय नहीं होता है)। यदि आप इसे पुन: पेश कर सकते हैं, तो एक बग रिपोर्ट भेजें (सटीक कमांड लाइन, सटीक इनपुट फ़ाइल (एस) का संकेत देते हुए, आप इसे किस सिस्टम पर चला रहे हैं और आपने बाइनरी कैसे प्राप्त की)।
गिल्स

4

-oवीम-वे का उपयोग करें या प्रयास करें :

$ ex -s +'%!sort' -cxa file.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.