चिह्नित लाइनों के बीच पाठ को संशोधित करें


0

मेरे पास 8000 से अधिक पंक्तियों वाली एक फ़ाइल है। फ़ाइल को अनुभागों में विभाजित किया गया है, प्रत्येक अनुभाग को ## C, ## T, ## N जैसे पाठ के साथ लेबल किया गया है। मुझे फ़ाइल में कुछ पंक्तियों को संशोधित करना है। मैंने इन मार्करों के बीच लाइनों को चिह्नित करने के लिए कमांड SED का उपयोग किया। मैं बैश में नया हूं, इसलिए मैं कुछ मदद करूंगा। मुझे उन मार्करों के बीच पाठ को संशोधित करना है

##C
##A - beginning marker (must be next row after ##C)
text lines, some of them I have to modify
text lines, some of them I have to modify
##B -end marker

अब तक मेरे पास मार्करों के बीच लाइनों को चिह्नित करने के लिए यह कमांड है

sed -e '/##A/,/##B/{}' file.txt

रेखाएँ इस तरह स्वरूपित होती हैं:

ZDMAD BELCH 0 0 25 26 30 50

मेरा लक्ष्य कुछ स्तंभों को विशिष्ट लाइनों में बदलना है। उदाहरण के लिए: जब पहला कॉलम ZDMAD 3 कॉलम को 15 में बदल देता है।

मैंने इस हल किए गए प्रश्न का उपयोग अपनी प्रगति के लिए किया

जवाबों:


0

चूँकि आप जानते हैं कि sedकेवल मार्करों के बीच कार्य कैसे किया जाता है , तो आपकी वास्तविक समस्या यह है कि आप इसे अभी "कुछ कॉलम बदलें" नहीं बना सकते। यह मुश्किल हो सकता है क्योंकि sedस्तंभों के बारे में पता नहीं है।

उदाहरण के लिए: जब पहला कॉलम ZDMAD 3 कॉलम को 15 में बदल देता है।

शायद यह विशेष उदाहरण में हल किया जा सकता है sed, लेकिन स्तंभों में हेरफेर करने के एक सामान्य मामले में awkबेहतर है क्योंकि यह रिकॉर्ड को खेतों में विभाजित करता है और अमूर्त के इस स्तर पर संचालित होता है।

यह मेरे डेबियन में काम करता है:

awk '
BEGIN {
   marked=0
   markA="##A"
   markZ="##B"
}
$1==markZ {marked=0}
$1=="ZDMAD" && marked==1 {$3=15}
$1==markA {marked=1}
{print $0}
' file.txt

प्रक्रिया:

  1. शुरुआत में उपयोगी चर सेट करें (यानी सिर्फ एक बार); "गैर-चिह्नित" स्थिति में शुरू करें।

फिर हर रिकॉर्ड के लिए:

  1. यदि पहला फ़ील्ड अंतिम मार्कर है, तो "गैर-चिह्नित" स्थिति पर जाएं।
  2. यदि स्थिति "चिह्नित" स्थिति में मिलती है, तो काम करें।
  3. यदि पहला फ़ील्ड शुरुआती मार्कर है, तो "चिह्नित" स्थिति पर जाएं।
  4. पूरे रिकॉर्ड को प्रिंट करें।

अंतिम मार्कर के लिए पहले प्रक्रिया की जाँच करें, नौकरी करता है और अंतिम मार्कर के लिए जाँच करता है। मुद्दा यह है कि मार्कर लाइनों में हेरफेर नहीं किया जाना चाहिए। आपके उदाहरण में स्थिति ( ZDMAD) किसी भी मार्कर लाइन से मेल नहीं खा सकती है, इसलिए एक अलग अनुक्रम एक समस्या नहीं होगी; लेकिन सामान्य तौर पर आपको इसे ध्यान में रखना चाहिए।


धन्यवाद। मुझे कुछ regex तुलना जोड़नी थी, यह सुनिश्चित करने के लिए कि ## N और ## A वाली पंक्तियाँ पाठ से पहले हैं, जिन्हें मैं संशोधित करता हूँ। लेकिन कोशिश करने के बाद भी यह काम करता है। मैं जाग या बेहोश करने के लिए सुपर नया हूं। मैं केवल ज्यादातर बैकअप स्क्रिप्ट बनाता था और वे Crontab का हिस्सा थे। तो आपकी प्रतिक्रिया के लिए फिर से धन्यवाद। :)
pesekvi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.