Sed का उपयोग कर पाठ को स्थानांतरित करें


-3

कृपया मुझे यह पता लगाने में मदद करें कि इसका उपयोग कैसे हल किया जाए sed

निम्नलिखित पाठ को देखते हुए:

केरल
        4222 8129 8163 8164        

दिल्ली      
        8502 8503 8504 8505       
गोवा
        १ ३ ९ ४५

मैं इसे निम्नलिखित प्रारूप में बदलना चाहता हूं:

केरल, 4222
केरल, 8129
केरल, 8163
दिल्ली, 8502
दिल्ली, 8503
दिल्ली, 8504
दिल्ली, 8505
गोवा, 1
गोवा, 39
गोवा, 45

क्या यह होना चाहिए sedऔर नहीं awk(या perl, pythonआदि)?
RedGrittyBrick

सुपरयुसर में आपका स्वागत है! आपको पता होना चाहिए कि यहां आम तौर पर अनुसंधान प्रयासों को दिखाने के लिए प्रश्नों की अपेक्षा की जाती है, जो शायद इसीलिए इसे वर्तमान में घटाया जा रहा है। SU एक स्क्रिप्ट लेखन सेवा नहीं है; यदि आपने कुछ कदम उठाए हैं, तो हम आपकी मदद कर सकते हैं। यहां जो अपेक्षित है उसके लिए एक महसूस करने के लिए सहायता केंद्र को पढ़ना सुनिश्चित करें।
मिकी टीके

जवाबों:


0

मान लेते हैं, कि आपकी फ़ाइल का नाम है test1

पूरा कमांड इस तरह दिखता है (एक पंक्ति में):

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") && names2=(${names//;/ }) && for var in "${names2[@]}"; do numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g"); numbers2=(${numbers//;/ }); for num in "${numbers2[@]}"; do echo "$var,$num"; done; done

बेहतर दृश्य के लिए, इस स्क्रिप्ट को देखें:

names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") 
names2=(${names//;/ })
for var in "${names2[@]}"; do 
    numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g")
    numbers2=(${numbers//;/ })
    for num in "${numbers2[@]}"; do 
        echo "$var,$num"
    done
done

अब मैं कमांड के सभी हिस्सों का वर्णन करना चाहता हूं

कमांड का विवरण

कमांड names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")मुझे आपके मामले में अर्धविराम के साथ अलग किए गए नामों की एक सूची देता है Kerala;Delhi;Goa। मैं उन्हें इस रूप में चाहता हूं, क्योंकि अब मैं उन्हें दूसरी कमान के साथ एक सरणी में बदल सकता हूं names2=(${names//;/ })। अब मैं सभी नामों के माध्यम से पुनरावृति करता हूं, जो पहले forलूप के साथ किया जाता है ।

आदेश numbers=$(cat test1 | sed -n "/$var/{n;p}" |sed "s/\s/;/g");मुझे वर्तमान चर के लिए संख्या देता है $var। इसके लिए Ie Keralaहोगा 4222;8129;8163;8164। व्यवहार पहले कमांड के समान है: मैं उन्हें एक सरणी में बदलना चाहता हूं, इसलिए मैं उनके माध्यम से पुनरावृति कर सकता हूं, जो अगले आदेश के साथ किया जाता है numbers2=(${numbers//;/ });। अब मैं संख्याओं के माध्यम से पुनरावृति करता हूं और उन्हें स्क्रीन पर प्रिंट करता हूं

for num in "${numbers2[@]}"; do echo "$var,$num"; done

मुझे उम्मीद है कि यह समझ में आएगा।


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