जागरण के साथ पाठ फ़ाइल के कॉलम को पुन: स्वरूपित करना


9

ठीक है, चूंकि यह एक जटिल प्रश्न है, मैं इसे स्पष्ट रूप से समझाऊंगा। मुझे नीचे दी गई एक फ़ाइल सामग्री मिली:

$ Cat File1 
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}

मुझे जो आउटपुट चाहिए

-Cool MNB +  POP ;
-Cool MNB  + POP ;
-Cool MNB  + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD +POP ;

सबसे पहले मैं आखिरी कॉलम को बाहर निकालने की कोशिश करता हूं File1और इसे प्रिंट करता हूंsed 's/[{}//g' File1 > File3

उसके बाद मैं File1एक नई की पूरी सामग्री की नकल करता हूंFile4

cp File1 File4

उसके बाद मैं डेटा को डेटा के File4साथ प्रतिस्थापित करता हूं File3(मतलब ब्रैकेट के बिना डेटा " File1अंतिम कॉलम जो एक")

awk 'FNR==NR{a[NR]=$1;next}{$5=a[FNR]}1' File3 File4 >>File5 

आउटपुट इस तरह होना चाहिए

ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP MNB
ABC Cool Lol POP TBMKF
ABC Cool Lol POP YUKER
ABC Cool Lol POP EFEFVD

अंत में, मैं कोशिश करता हूं

awk -F " '{print - $2,$5 +,$4 ";"}‘ File5

लेकिन परिणाम नहीं निकला जैसा कि मैं चाहता हूं, केवल उसी डेटा MNB को सभी सूचीबद्ध किया गया है, दूसरों को नहीं दिखाया गया है (फ़ाइल एक अंतिम स्तंभ डेटा),


क्या आप गन्नू जाग का उपयोग कर रहे हैं?
123

मुझे यकीन नहीं है कि यू का क्या मतलब है। लेकिन मैं सिर्फ जाग को छूने के लिए एक नया भिक्षु हूं। यह वह कार्य है जिसे मुझे करने की आवश्यकता है, मैं अपनी पूरी कोशिश करता हूं कि जागने की मेरी समझ के आधार पर धीरे-धीरे एक कदम बढ़ाएं।
heng960407 13:15

1
प्रकार awk --version, परिणाम क्या है?
123

3
कृपया अपनी समस्या के लिए अपने शीर्षक को कुछ और विशिष्ट में बदलें। यह उन लोगों के लिए आसान हो जाएगा जिनके पास भविष्य में इसी तरह के प्रश्न हैं, इसे खोजने के लिए। फिलहाल "जाग के बारे में एक सवाल" बहुत सामान्य है।
टॉम फेनेच

जवाबों:


16

मुझे नहीं पता कि आप चीजों को बाएं और दाएं क्यों कॉपी कर रहे हैं। सीधी सी बात है

awk '{print "-" $2, substr($5,2,length($5)-2), "+", $4, ";"}' File1

मैंने -शुरुआत और ;अंत में शुरुआत की ।

बीच में हम छापते हैं

  • $2 क्योंकि हम इसे वैसे ही चाहते हैं।
  • का एक विकल्प $5, जो पहले और अंतिम चरित्र के बिना स्ट्रिंग है। हम स्थिति 2 पर शुरू करके पहला चरित्र छोड़ते हैं (awk हमेशा इस बारे में अजीब रहा है) और अंतिम विकल्प को केवल एक विकल्प का चयन करके छोड़ते हैं जो दो वर्णों से छोटा होता है, मूल से$5
  • +क्योंकि हम यह चाहते
  • और फिर $4

हालाँकि, मुझे यकीन नहीं है कि ये सभी स्ट्रिंग फ़ंक्शन GNU awk के लिए विशिष्ट हैं।


substr(string, 2)सबस्ट्रिंग दूसरा चरित्र, की तरह से शुरू रिटर्न cut -c2-, tail -n +2, sed '2,$'... क्या इतनी अजीब है कि के बारे में है?
स्टीफन चेजलस

3
यह आदेश मानक है और awk70 के दशक से मूल के साथ भी काम करेगा ।
स्टीफन चेजलस

@ स्टीफनचेलजेलस: आह, मैं आपका इंतजार कर रहा हूं :-) आमतौर पर हम 0 पर गिनना शुरू करते हैं जिसका मतलब है कि सूचकांक 2 तीसरा स्थान है, लेकिन यहां दूसरा स्थान सूचकांक में है। शेष जीएनयू प्रश्न को स्पष्ट करने के लिए धन्यवाद।
बनगुंगिन

@Banganguin, यूनिक्स शेल और उपयोगिताओं में जैसा कि ऊपर दिए गए कुछ उदाहरणों में दिखाया गया है, हम 1 से शुरू करते हैं, न कि 0. सबसे उल्लेखनीय अपवाद हैं ksh के एरेज़ और $ {var: ऑफसेट} (दोनों बैश द्वारा कॉपी किए गए)। अन्य सभी शेल सरणियां 1 से
स्टीफन चेज़लस

7

सेड के साथ

sed '
    s/\S\+\s/-/
    s/\(\S\+\s\)\{2\}{\(\S\+\)}/\2 + \1;/
    ' File1

और अजीब बदलाव

awk -F"[[:blank:]{}]+" '{print "-" $2, $5, "+", $4}' ORS=" ;\n" File1

6

आसान TXR नौकरी:

$ txr -c '@(repeat)
@a @b @c @d {@e}
@(do (put-line `-@b @e + @d ;`))
@(end)' -
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {MNB}
ABC Cool Lol POP {TBMKF}
ABC Cool Lol POP {YUKER}
ABC Cool Lol POP {EFEFVD}
[Ctrl-D][Enter]
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool MNB + POP ;
-Cool TBMKF + POP ;
-Cool YUKER + POP ;
-Cool EFEFVD + POP ;

TXR लिस्प awk मैक्रो का उपयोग करना, अनुवाद के लिए Awk समाधान:

 txr -e '(awk (t (prn `-@[f 1] @{[f 4] [1..-1]} + @[f 3] ;`)))'

फ़ील्ड fसूची में हैं, और अनुक्रमण शून्य आधारित है।


1
लिस्प और क्रायिएस्ट लुक के लिए +1! उस भाषा को
पीसीजी

@Archemar TXR बहुत अच्छी तरह से गोल्फ में प्रतिस्पर्धा नहीं करता है क्योंकि इसके लिए डिज़ाइन की गई विशेष भाषाएं हैं जो व्यक्तिगत पात्रों को असाइन किए गए कार्यों की तरह काम करती हैं, जो तब रचना को प्राप्त करने के लिए एक साथ संघर्ष कर सकते हैं।
कज़

@Archemar एक प्रविष्टि रखें: codegolf.stackexchange.com/questions/68712/output-the-next-kana
Kaz

1
@ Kaz कहीं एक TXR ट्यूटोरियल है? आदमी पृष्ठ बल्कि विशाल लगता है। जागरण की तुलना में यह कैसा प्रदर्शन करता है?
bli

1
@ बीली ग्नू अवेक TXR awk मैक्रो की तुलना में एक बड़ी फ़ाइल के माध्यम से बुनियादी क्षेत्र में बंटवारे में कम से कम 30 गुना तेजी से ऐसा कुछ है, जो व्याख्या कोड की कुछ 220+ लाइनें है , जिसमें रिकॉर्ड स्रोतों और क्षेत्रों में इनपुट स्रोतों के प्रसंस्करण के लिए समग्र लूप शामिल है।
कज़

3

जाग का उपयोग करना सबसे आसान है जब $1,$2,...खेतों में पहले से ही सटीक तार होते हैं जिनके साथ आप काम करना चाहते हैं। क्षेत्र विभाजक, यदि इसमें एक से अधिक वर्ण हैं, तो एक नियमित अभिव्यक्ति के रूप में व्याख्या की जाती है। हमें {घुंघराले ब्रेस} से छुटकारा पाने के लिए किसी भी खोज और प्रतिस्थापन या प्रतिस्थापन के संचालन की आवश्यकता नहीं है। हम उन्हें केवल सीमांकक के भाग के रूप में गिनते हैं।

awk -F'[ {}]+' '{printf("-%s %s + %s ;\n", $2, $5, $4)}'

printfइसके बजाय का उपयोग करने से printयह देखना थोड़ा आसान हो जाता है कि स्ट्रिंग को कैसे स्वरूपित किया जाएगा, लेकिन यदि आप print "-"$2,$5" + "$4";"इसके बजाय चाहते हैं printf("-%s %s + %s ;\n", $2, $5, $4), तो यह एक विकल्प है।

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