VIM में बड़ी फ़ाइलों के साथ काम करना


108

मैंने VIM में एक बहुत बड़ी (~ 2GB) फ़ाइल खोलने की कोशिश की लेकिन यह चोक हो गई। मुझे वास्तव में फ़ाइल को संपादित करने की आवश्यकता नहीं है, बस कुशलता से कूदें।

मैं वीआईएम में बहुत बड़ी फ़ाइलों के साथ काम करने के बारे में कैसे जा सकता हूं?



5
विम आप जब तक ठीक किया जाना चाहिए :set binaryपहले ...
ephemient

1
यह एक नए फ़्यूज़ फाइलसिस्टम के लिए एक अच्छा लक्ष्य है! विभाजन या ऐसा कुछ ... मैं इसमें हूँ!
रॉडरिगो

1
बहुत देर से ... यह पहले से ही मौजूद है: sourceforge.net/projects/joinsplitfs
rodrigo

5
आपको एक पेजर की जरूरत है, संपादक की नहीं! नीचे जिम का जवाब देखें।
लेस्टर चेउंग

जवाबों:


85

मेरे पास आज संपादित करने के लिए एक 12GB फ़ाइल थी। विम लार्जफाइल प्लगइन ने मेरे लिए काम नहीं किया। यह अभी भी मेरी सारी मेमोरी का उपयोग करता है और फिर एक त्रुटि संदेश मुद्रित करता है :-( मैं या तो हेक्सिडिट का उपयोग नहीं कर सकता, क्योंकि यह कुछ भी सम्मिलित नहीं कर सकता है, बस ओवरराइट कर दें। यहां एक वैकल्पिक दृष्टिकोण है:

आप फ़ाइल को विभाजित करते हैं, भागों को संपादित करते हैं और फिर इसे फिर से जोड़ते हैं। आपको अभी भी डिस्क स्थान से दोगुना चाहिए।

  • जिस पंक्ति को आप संपादित करना चाहते हैं, उसके चारों ओर ग्रीप:

    grep -n 'something' HUGEFILE | head -n 1
    
  • फ़ाइल की वह सीमा निकालें। वे पंक्तियाँ कहें जिन्हें आप संपादित करना चाहते हैं पंक्ति 4 और 5 पर हैं।

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • -nविकल्प sed के डिफ़ॉल्ट व्यवहार को दबाने के लिए सब कुछ मुद्रित करने के लिए आवश्यक है
    • 4,5p प्रिंट्स लाइन्स 4 और 5
    • 5q 5 लाइन प्रसंस्करण के बाद sed गर्भपात
  • SMALLPARTअपने पसंदीदा संपादक का उपयोग करके संपादित करें ।

  • फाइल को मिलाएं:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • अर्थात: हुइगइमर से संपादित लाइनों से पहले सभी लाइनों को चुनें (जो कि इस मामले में शीर्ष 3 लाइनें हैं), इसे संपादित लाइनों (इस मामले में लाइनों 4 और 5 में) के साथ मिलाएं और इस संयुक्त सेट का उपयोग करके लाइनों को बदल दें। HUGEFILE में समतुल्य (इस मामले में शीर्ष 5 लाइनें) और यह सब एक नई फ़ाइल में लिखें।

    HUGEFILE.newअब आपकी संपादित फ़ाइल होगी, आप मूल को हटा सकते हैं HUGEFILE


30

यह कई वर्षों से एक आवर्ती प्रश्न है। (संख्या बदलती रहती है, लेकिन अवधारणा समान है: मैं उन फ़ाइलों को कैसे देखूं या संपादित करूं जो मेमोरी से बड़ी हैं?)

जाहिर है moreया lessकेवल फाइलों को पढ़ने के लिए अच्छे दृष्टिकोण हैं --- lessयहां तक ​​कि ऑफ़र भीvi स्क्रॉलिंग और खोज के लिए कीबाइंडिंग जैसे ।

"बड़ी फ़ाइलों" पर एक नए सिरे से खोज से पता चलता है कि दो संपादक आपकी आवश्यकताओं के लिए विशेष रूप से अनुकूल होंगे।

एक होगा: lfhex ... एक बड़ी फ़ाइल हेक्स संपादक (जो कि क्यूटी पर निर्भर करता है)। यह एक, स्पष्ट रूप से, एक जीयूआई का उपयोग करने पर जोर देता है।

एक अन्य कंसोल उपयोग के लिए अनुकूल प्रतीत होगा: हिंग ... और यह एक vim-जैसे इंटरफ़ेस (एक सहित) का दावा करता हैex मोड ) का ।

मुझे यकीन है कि मैंने लिनक्स / यूनिक्स के लिए अन्य संपादकों को देखा है जो मेमोरी में अपनी संपूर्णता को लोड किए बिना फ़ाइलों के माध्यम से पृष्ठ करने में सक्षम थे। हालाँकि, मुझे उनका कोई नाम याद नहीं है। मैं इस प्रतिक्रिया को अन्य संपादकों के साथ अपने लिंक जोड़ने के लिए प्रोत्साहित करने के लिए "विकी" प्रविष्टि बना रहा हूं। (हां, मैं इस मुद्दे के इर्द-गिर्द काम करने के तरीकों से परिचित हूं splitऔर cat; लेकिन मैं संपादकों के बारे में सोच रहा हूं, विशेष रूप से कंसोल / शाप संपादकों के बारे में जो इससे दूर हो सकते हैं और हमें समय / विलंबता और डिस्क स्थान को उपरिशायी कर सकते हैं जो इस तरह के दृष्टिकोणों से बचते हैं) ।


23

चूंकि आपको वास्तव में फ़ाइल को संपादित करने की आवश्यकता नहीं है:

  1. view (या vim -R ) बड़ी फ़ाइलों पर यथोचित कार्य करना चाहिए।
  2. या आप उपयोग कर सकते हैं moreयाless

"चुटकुले" से आपका मतलब खुलने में थोड़ा समय लगता है? या वास्तव में क्रैश? view(अभी आजमाया और समय पर) 2.7GB फ़ाइल को खोलने के लिए मेरे नहीं-हाल ही के लिनक्स बॉक्स पर 4 मिनट से अधिक का समय लगता है। दी, यह बिल्कुल तत्काल नहीं है, लेकिन यह काम करता है।
ChssPly76

हाँ, यह स्टाल। मुझे यकीन है कि अगर मैंने इंतजार किया तो यह आखिरकार खुल जाएगा। मैं कम के साथ चला गया हूं क्योंकि यह तुरंत खुलता है और मैं नेविगेशन के लिए उपयोग किया जाता हूं।
hoju

9

मैंने फ्लोरियन के उत्तर पर आधारित एक छोटी स्क्रिप्ट लिखी है जिसमें नैनो (मेरा पसंदीदा संपादक) का उपयोग किया गया है:

#!/bin/sh

if [ "$#" -ne 3 ]; then
  echo "Usage: $0 hugeFilePath startLine endLine" >&2
  exit 1
fi

sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2

इसे इस तरह उपयोग करें:

sh hfnano yourHugeFile 3 8

उस उदाहरण में, नैनो 8 के माध्यम से लाइनों 3 को खोलेगी, आप उन्हें संपादित कर सकते हैं, और जब आप सहेजते हैं और छोड़ते हैं, तो भारी संख्या में उन पंक्तियों को स्वचालित रूप से आपकी सहेजी गई पंक्तियों के साथ अधिलेखित कर दिया जाएगा।


3

मैं एक ही समस्या थी, लेकिन यह एक 300GB mysql डंप था और मैं से छुटकारा पाने के लिए चाहते थे DROPऔर परिवर्तन CREATE TABLEकरने के लिए CREATE TABLE IF NOT EXISTSइतनी के दो आमंत्रण को चलाने के लिए नहीं करना चाहता था sed। मैंने इस त्वरित रूबी स्क्रिप्ट को उन परिवर्तनों के साथ फ़ाइल को धोखा देने के लिए लिखा है:

#!/usr/bin/env ruby

matchers={
    %q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
    %q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}

matchers.each_pair { |m,r|
    STDERR.puts "%s: %s" % [ m, r ]
}

STDIN.each { |line|
    #STDERR.puts "line=#{line}"
    line.chomp!
    unless matchers.length == 0
        matchers.each_pair { |m,r|
            re=/#{m}/
            next if line[re].nil?
            line.sub!(re,r)
            STDERR.puts "Matched: #{m} -> #{r}"
            matchers.delete(m)
            break
        }
    end
    puts line
}

जैसे मंगवाया गया

./mreplace.rb < foo.sql > foo_two.sql

सिर्फ दौड़ने के लिए ध्यान दें, इसे एक exe के रूप में चलाने के लिए chmod +x mreplace.rbसबसे पहले आवश्यकता है , आप भी कर सकते हैंruby mreplace.rb ..
Smar

धन्यवाद @ स्तुति मैककॉली! अच्छा काम। इस प्रश्न का उत्तर खोजते समय वास्तव में मैं क्या देख रहा था।
नैट रिटर

3

विशाल एक-लाइनर्स के लिए (से वर्णों को प्रिंट 1करता है 99):

cut -c 1-99 filename

2

यह पहले से ही देर से है, लेकिन अगर आप इसे संपादित किए बिना फ़ाइल के माध्यम से नेविगेट करना चाहते हैं, catतो काम भी कर सकते हैं।

% cat filename | less

या वैकल्पिक रूप से सरल:

% less filename

8
ध्यान दें कि catफ़ाइल को पहले टिंग करना बेवकूफी है, क्योंकि या तो इसका मतलब है कि फ़ाइल पूरी तरह से मेमोरी में होगी (इसलिए lessफ़ाइल की तलाश की जा सकती है) या इसे बिल्कुल भी खोजा नहीं जा सकता है; catबस स्थिर उत्पादन स्ट्रीम देता है।
स्मार

1

emacs मेगाबाइट्स के 100 में फ़ाइलों के साथ बहुत अच्छी तरह से काम करता है, मैंने इसे लॉग फ़ाइलों पर बहुत अधिक परेशानी के बिना उपयोग किया है।

लेकिन आम तौर पर जब मेरे पास किसी तरह का विश्लेषण कार्य होता है, तो मुझे एक पर्ल स्क्रिप्ट लिखना बेहतर विकल्प लगता है।


0

पुराना धागा। लेकिन फिर भी (वाक्य :))।

 $less filename

यदि आप संपादित नहीं करना चाहते हैं तो कम कुशलता से काम करते हैं और केवल उसी के आसपास देखते हैं जो विशाल लॉग फ़ाइलों की जांच के लिए है।

Vi जैसे कम कामों में खोजें

सबसे अच्छा हिस्सा, यह अधिकांश डिस्ट्रोस पर डिफ़ॉल्ट रूप से उपलब्ध है। तो उत्पादन पर्यावरण के लिए भी समस्या नहीं होगी।


650MB पाठ फ़ाइल में कम के साथ खोज एक PITA साबित हुई। लार्जफाइल के साथ विम का उपयोग करना एक आकर्षण की तरह काम करता है।
MariusCC

2
@MariusCC तब आपने 2 GB से अधिक फ़ाइलों के साथ काम नहीं किया है, आपका आकर्षण क्रैश हो जाएगा!
दीपावली

-15

यह पुराना है लेकिन, नैनो, विम या जीवीएम का उपयोग करें


5
ये उपकरण समस्या का समाधान करने के लिए कुछ नहीं करते हैं।
डग वोल्फग्राम

1
नैनो स्मृति भरती है और मुझ पर मरती है।
ट्राईनेकविक्ज़ मारिअस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.