क्या लक्ष्य से पहले और बाद में 2 पंक्तियों (यदि कोई है) को प्रिंट करने का कोई तरीका है या नहीं तो एक प्लेसहोल्डर प्रिंट करें?


2

मैं मूल अंग्रेजी वक्ता नहीं हूं इसलिए मुझे स्पष्ट होने की उम्मीद है।

मुझे इसके बारे में मालूम है grep -C 2 "TARGET" inputfile TARGET की पंक्ति से पहले और बाद में 2 पंक्तियों का चयन करने के लिए, लेकिन मैं अपनी समस्या को प्रबंधित करने के लिए इसका उपयोग करने में सक्षम नहीं हूं। मेरे पास इस तरह से संरचित फाइलें हैं

1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3
9 0 value1 value2 value3

कई पंक्तियों के साथ। आवश्यक समाधान इस तरह की एक फ़ाइल होगी

X X X X X
1 0 value1 value2 value3
2 H value1 value2 value3 *
3 H value1 value2 value3 
4 H value1 value2 value3

1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3 *
4 H value1 value2 value3 
5 H value1 value2 value3

... all the other till

6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3 *
9 0 value1 value2 value3
X X X X X

जहां TARGET "H" है, * चयनित पंक्ति को इंगित करना है (लेकिन मुझे आउटपुट फ़ाइल में * की आवश्यकता नहीं है) और X लक्ष्य के पहले या बाद में पंक्तियों की संख्या को समायोजित करने के लिए प्लेसहोल्डर हैं! मैं awk और sed के साथ भी कोई परिणाम नहीं के साथ की कोशिश की।

जवाबों:


4

ग्लेन जैकमैन के रूप में एक ही दृष्टिकोण, लेकिन हर इनपुट पर बफर को घुमाने के बजाय एक परिपत्र बफर के साथ:

awk -v N=2 -v TARGET=" H " -v PLACE="X X X X X" '
  function check(n, s,     i) {
    a[n%NN]=s
    if (n>N&&a[(n-N)%NN]~TARGET) {
      for (i=n+1;i<=n+NN;++i)
        print a[i%NN]
      print ""
    }
  }

  BEGIN{
    NN=2*N+1
    a[0]=PLACE
    for (i=1;i<=N;++i) { getline a[i]; a[i+N]=PLACE }
  }

  { check(NR,$0) }

  END{
    for (i=NR+1;i<=NR+N;++i) check(i,PLACE)
  }'

यह भी एक दिलचस्प जवाब है। धन्यवाद, अब मुझे नहीं पता कि किसे चुनना है!
bonimba3

सही उत्तर के बारे में मेरा विचार बदलो। यह संस्करण इस बात को ध्यान में नहीं रखता है कि मैं बीच में एक लक्ष्य के साथ केवल अनुक्रम मुद्रित करना चाहता हूं (स्थिति 3)।
bonimba3

@ bonimba3: क्या आपके पास एक इनपुट फ़ाइल है जो एक अवांछित अनुक्रम प्रिंट करता है?
rici

हाँ। मेरे पास प्रोसेस करने के लिए हजारों फाइलें हैं, इसलिए मैंने उस फाइल में से कुछ में उस समस्या के बारे में देखा, जिसे मैंने चेक किया था।
bonimba3

@ bonimba3: यदि आप वास्तव में त्रुटि को पुन: उत्पन्न कर सकते हैं, तो मुझे दिलचस्पी होगी क्योंकि मैं नहीं देखता कि यह कैसे हो सकता है। क्या आप निश्चित हैं कि लक्ष्य रेखा मध्य रेखा में किसी अन्य स्थान पर नहीं होती है?
rici

4

यह आपको वहां अधिकांश तरीके से मिलेगा:

awk -v n=2 -v target=" H " '
    BEGIN {
        lines[0]=""
        for (i=1; i<=n; i++) {
            lines[i]="X X X X X"
            getline; lines[n+i]=$0
        }
    }
    function rotate(i) {
        for (i=1; i<=n*2; i++) 
            lines[i-1] = lines[i]
        lines[n*2]=$0
    }
    function check(i) {
        if (lines[n] ~ target) {
            for (i=0; i<=n*2; i++) 
                print lines[i]
            print ""
        }
    }
    { rotate(); check() }
    END {
        for (i=1; i<=n; i++) {
            $0 = "X X X X X"; rotate(); check()
        }
    }
' inputfile

आउटपुट

X X X X X
1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3

1 0 value1 value2 value3
2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3

2 H value1 value2 value3
3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3

3 H value1 value2 value3
4 H value1 value2 value3
5 H value1 value2 value3
6 0 value1 value2 value3
7 0 value1 value2 value3

6 0 value1 value2 value3
7 0 value1 value2 value3
8 H value1 value2 value3
9 0 value1 value2 value3
X X X X X

प्रभावशाली! और, थोड़े अध्ययन के साथ, बहुत स्पष्ट भी। धन्यवाद
bonimba3

n = 3 के साथ परीक्षण किसी कारण से काम नहीं किया - लाइन 8 पर केंद्रित ब्लॉक नहीं मिला। मैं इसे एक अभ्यास के रूप में छोड़ दूँगा।
glenn jackman

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