केवल दोहरे उद्धरण चिह्नों के भीतर मौजूद अल्पविराम निकालें


10

एक पाठ फ़ाइल में, मैं ,(कॉमा) को हटाना चाहता हूं और "(उद्धरण) (केवल अगर दोहरे उद्धरणों में कॉमा द्वारा अलग किए गए नंबर हैं)।

56,72,"12,34,54",x,y,"foo,a,b,bar"

अपेक्षित ouput

56,72,123454,x,y,"foo,a,b,bar"

नोट: मैं उपरोक्त लाइन को एक उदाहरण के रूप में दिखाता हूं। मेरी पाठ फ़ाइल में ऊपर की तरह कई पंक्तियाँ हैं और दोहरे उद्धरण चिह्नों के भीतर मौजूद अल्पविराम द्वारा अलग किए गए अंक अलग-अलग होने चाहिए। अर्थात्,

56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"

अपेक्षित उत्पादन:

56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

वहाँ एक nनंबर की संख्या अल्पविराम के द्वारा अलग दोहरे उद्धरण चिह्नों के भीतर प्रस्तुत करते हैं। और दोहरे उद्धरणों को भी छोड़ दें जिनमें वर्ण हैं जैसे कि यह है।

मुझे sedटेक्स्ट प्रोसेसिंग टूल पसंद है। यदि आप इसके sedलिए कोई समाधान पोस्ट करते हैं तो मुझे खुशी है ।


से 56,72,"12,34,54",x,y,"foo,a,b,bar"करने के लिए 56,72,123454,x,y,"a,b", fooऔर barहै गायब हो जाते हैं। क्या यह आपका वांछित आउटपुट है?
कोउंगलम

आपके द्वारा उपयोग किया जाने वाला उदाहरण कुछ भ्रामक है क्योंकि कुछ तत्व (जैसे fooऔर bar) अल्पविराम के साथ हटा दिए जाते हैं। इसके अलावा, कुछ उद्धरण गायब हो जाते हैं जहां अन्य रहते हैं। यह उल्लेख नहीं है कि बीच में अल्पविराम aऔर bसाथ ही रहते हैं। क्या इनका कोई पैटर्न है?
हेलोजगॉस्ट

क्षमा करें मित्र।
अविनाश राज

आपके संपादन ने वास्तव में आपके उदाहरण को स्पष्ट नहीं किया है। कृपया मेरी अंतिम टिप्पणी देखें ।
हेलोजगॉस्ट

दोहरे उद्धरण चिह्नों के अंदर सभी अल्पविरामों को हटा दें और उद्धरणों की संख्याओं को भी शामिल करें।
अविनाश राज

जवाबों:


7

यह ( यहां से अनुकूलित ) आपको वही करना चाहिए जो हालांकि @ rici का पर्ल बहुत सरल है:

$ sed -r ':a;s/(("[0-9,]*",?)*"[0-9,]*),/\1/;ta; s/""/","/g; 
          s/"([0-9]*)",?/\1,/g ' file
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454,
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

व्याख्या

  • :a: एक लेबल परिभाषित करें a
  • s/(("[0-9,]*",?)*"[0-9,]*),/\1/ : इस एक को तोड़ने की जरूरत है
    • सबसे पहले, इस संरचना का उपयोग करते हुए: (foo(bar)), \1हो जाएगा foobarऔर \2हो जाएगा bar
    • "[0-9,]*",?: से मेल खाते हैं 0 या अधिक 0-9या ,, 0 या 1 के बाद ,
    • ("[0-9,]*",?)* : मैच 0 या उससे अधिक।
    • "[0-9,]*: मैच 0 या अधिक 0-9या ,कि सही एक के बाद आते हैं"
  • ta;: लेबल के लिए वापस जाओ aऔर फिर से चलाने अगर प्रतिस्थापन सफल रहा था।
  • s/""/","/g;: प्रोसेसिंग के बाद। बदलें ""के साथ ","
  • s/"([0-9]*)",?/\1,/g : संख्या के आसपास सभी उद्धरण हटा दें।

इसे दूसरे उदाहरण से समझना आसान हो सकता है:

$ echo '"1,2,3,4"' | sed -nr ':a;s/(("[0-9,]*",?)*"[0-9,]*),/\1/;p;ta;'
"1,2,34"
"1,234"
"1234"
"1234"

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

इस बिंदु पर मेरा मानना ​​है info sedकि उन्नत कार्यों का वर्णन करने वाले अनुभाग में प्रकट होने वाले उद्धरण का उल्लेख करना उपयोगी है जैसे कि ऊपर प्रयोग किया गया लेबल (धन्यवाद अगर @Braiam खोजने के लिए):

ज्यादातर मामलों में, इन आदेशों का उपयोग यह इंगित करता है कि आप शायद 'awk' या पर्ल जैसे किसी प्रोग्रामिंग में बेहतर हैं।


10

यदि पर्ल ठीक है, तो यह करने का एक छोटा (और शायद तेज़, यदि जरूरी नहीं कि सरल :)) तरीका है:

perl -pe 's:"(\d[\d,]+)":$1=~y/,//dr:eg' file

eध्वज के लिए s:::ऑपरेटर (जो सिर्फ लेखन का एक और तरीका है s///) प्रतिस्थापन एक अभिव्यक्ति जो हर बार मूल्यांकन किया जाता है के रूप में में माना जाता है। वह अभिव्यक्ति $1regex (जो पहले से ही उद्धरण याद कर रही है) से कैप्चर करता है और सभी कॉमा को हटाकर ( ) के y///रूप में भी लिखा जा सकता है । करने के लिए ध्वज के बजाय अनुवाद की गिनती की है, ताकि मूल्य अनुवादित स्ट्रिंग होने के लिए प्राप्त करने के लिए आवश्यक है।tr////dry

उन लोगों के लिए जो किसी तरह पेरल द्वारा परेशान महसूस करते हैं, यहां अजगर बराबर है। पायथन वास्तव में एक शेल-लाइनर उपकरण नहीं है, लेकिन कभी-कभी इसे सह-संचालन में काजोल किया जा सकता है। निम्नलिखित को एक पंक्ति के रूप में लिखा जा सकता है ( forलूप के विपरीत , जो नहीं हो सकता), लेकिन क्षैतिज स्क्रॉल इसे बनाता है (और भी) अपठित:

python -c '
import re;
import sys;
r=re.compile("\"(\d+(,\d+)*)\"");
all(not sys.stdout.write(r.sub(lambda m:m.group(1).replace(",",""),l))
    for l in sys.stdin)
' < file

@rici: अच्छा एक! और हमें एक और चरित्र y///को tr///बचाने के बजाय उपयोग करें।
कोउंगलम

6

CSV डेटा के लिए, मैं एक वास्तविक CSV पार्सर वाली भाषा का उपयोग करूंगा। रूबी के साथ उदाहरण के लिए:

ruby -rcsv -pe '
  row = CSV::parse_line($_).map {|e| e.delete!(",") if e =~ /^[\d,]+$/; e} 
  $_  = CSV::generate_line(row)
' <<END
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
END
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"

0

Blockquote

नमस्ते यहाँ पायथन कोड को दोहरे उद्धरण चिह्नों में बदलने के लिए, अल्पविराम को पाइप (|) वर्ण से प्रतिस्थापित किया जाता है

यह पायथन कोड डबल कोट्स में संलग्न कॉमा को प्रतिस्थापित करना है

जैसे: x, y, z, 1,2, "r, e, t, y", h, 8,5,6

अगर पाइप x, y, z, 1,2, "r | e | t | y | y", h, 8,5,6 से प्रतिस्थापित किया जाए

यदि null x, y, z, 1,2, "rety", h, 8,5,6 से प्रतिस्थापित किया जाए

writingFile = open('FileToWrite', 'w')
with open('FileToRead') as f:

    while True:

        c = f.read(1)
        if not c:
            print ("End of file")
            break
        print ("Read a character:", c)


        if c=='"':
            writingFile.write(c) 
            c = f.read(1)
            while c != '"':
                if c== ',':
                    c= '|'
                writingFile.write(c)
                c = f.read(1)


        writingFile.write(c)


writingFile.close()

थोड़ी व्याख्या की जरूरत है।
मोंगरेल

इस अजगर कोड का उपयोग दोहरे उद्धरणों में चीजों को बदलने के लिए किया जाता है
विजय कुमार अकारापू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.