2012-07-28 21 views
8

पर आधारित लाइनों में से एक को प्रिंट करना मेरे पास एक इनपुट फ़ाइल है जो इस तरह दिखती है (पहला कॉलम एक स्थान संख्या है और दूसरा एक गिनती है जो समय के साथ बढ़नी चाहिए) :अगली पंक्ति में मौजूदा लाइन की तुलना करने के लिए अजीब समाधान और

1  0 
1  2 
1  6 
1  7 
1  7 
1  8 
1  7 
1  7 
1  9 
1  9 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 

और मैं इसे (स्थानापन्न मायने रखता है कि पिछले गिनती के साथ कम किया है) इस तरह दिखना ठीक करने के लिए करना चाहते हैं:

1  0 
1  2 
1  6 
1  7 
1  7 
1  8 
1  8 
1  8 
1  9 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 

मैं इस के लिए awk का उपयोग करने की कोशिश कर रहा है, लेकिन हूँ गेटलाइन के साथ ठोकरें क्योंकि मुझे लगता है कि लाइन नंबर (एनआर?) को रीसेट करने का तरीका नहीं है, तो यह आर होगा प्रत्येक पंक्ति को ईड करें और यह अगली पंक्ति है, एक समय में दो लाइनें नहीं। यह कोड मेरे पास अब तक कोई विचार है?

1  0 
1  6 
1  7 
1  7 
1  9 
1  10 
1  9 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
+0

एक वर्बोज़ संस्करण है ठीक है, बस स्पष्ट करने के लिए, क्या आप * उन रेखाओं को छोड़ने की कोशिश कर रहे हैं जहां गिनती कम हो जाती है? यह बहुत सी रेखाएं हैं, मुझे आश्चर्य है कि क्या आप एक छोटा सा उदाहरण दे सकते हैं जो स्पष्ट होगा? – Levon

+0

क्षमा करें अगर मेरी व्याख्या स्पष्ट नहीं थी, तो गिनती घटने पर पिछली पंक्ति मुद्रित करना चाहती है, इसलिए लाइनों की एक ही संख्या के साथ समाप्त होता है लेकिन एक फ़ाइल के साथ जहां गिनती रखती है या बढ़ती है, लेकिन कभी कम नहीं होती है। – suegene

+0

मुझे मिल गया .. नीचे दिए गए उत्तरों की जांच करें, मुझे लगता है कि आप जो खोज रहे थे वह आपको मिलेगा। – Levon

उत्तर

7

शायद सब आप चाहते है:

awk '{a=$1; b=$2; getline; c=$1; d=$2; if (a==c && b<=d) print a"\t"b; else print c"\t"d}' original.txt > fixed.txt 

इसके अलावा, इस उत्पादन मैं वर्तमान में हो रही है

awk '$2 < p { $2 = p } { p = $2 } 1' input-file 

यह पहली पंक्ति पर विफल हो जाएगा यदि में मूल्य दूसरा कॉलम ऋणात्मक है, इसलिए करें:

awk 'NR > 1 && $2 < p ...' 

यदि वर्तमान मान कम है, तो यह केवल दूसरे मान को दूसरे मान पर सेट करता है, फिर परिवर्तनीय पी में वर्तमान मान संग्रहीत करता है, फिर रेखा को प्रिंट करता है।

ध्यान दें कि यह भी बदलती रेखाओं पर आउटपुट की दूरी को थोड़ा सा संशोधित करता है। अपने इनपुट टैब से अलग है, तो आप क्या करना चाहते हो सकता है:

awk 'NR > 1 && $2 < p { $2 = p } { p = $2 } 1' OFS=\\t input-file 
+0

वाह .. बहुत अधिक संक्षिप्त .. मुझे लगता है कि मेरे पास आपके पहले समाधान – Levon

+0

शानदार का वर्बोज़ संस्करण है, मैं बस रिक्ति को समझने की कोशिश कर रहा था, धन्यवाद! – suegene

2

यह स्क्रिप्ट आप क्या पसंद करेंगे:

{ 
    if ($2 < prev_count) 
    $2 = prev_count 
    else 
    prev_count = $2 

    printf("%d %d\n", $1, $2) 
} 

यह आसानी से पढ़ने योग्य होने के लिए :)

+0

धन्यवाद, मैं वर्बोज़ संस्करण की भी सराहना करता हूं! – suegene

+0

@suegene मदद करने में हैप्पी .. मैंने 'printf' के साथ आउटपुट स्पेसिंग को समायोजित किया है जो आपको आवश्यकता होने पर प्रारूप/रिक्ति पर थोड़ा अधिक नियंत्रण दे सकता है। – Levon