AWK के साथ पंक्तियों (लाइनों) को कैसे घटाएं


9

मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं लाइनों को घटाने के लिए AWK का उपयोग कैसे कर सकता हूं । उदाहरण के लिए, इनपुट फ़ाइल की कल्पना करें:

30
20

उत्पादन होगा:

10

अब, एक परीक्षण के रूप में मैं "प्रयुक्त" मेमोरी कॉलम की गणना करने की कोशिश कर रहा हूं:

$ cat /proc/meminfo

इसलिए फिलहाल मैंने यह लिखा है:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    -- Here comes the calculation using AWK

मैंने निम्नलिखित कोशिश की है:

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' 

लेकिन यह सिर्फ मुझे डेटा की अंतिम पंक्ति देता है।

मुझे काम करने का हल मिल गया है, लेकिन मुझे शक है कि यह सबसे इष्टतम है। मेरे सभी कोडिंग अनुभव मुझे बताते हैं कि पंक्तियों की मात्रा को हार्ड कोडिंग भयानक है: पी

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | awk 'NR == 1{s=$0} NR == 2 {s=s-$0} END {print s}'

N पंक्तियों के साथ आप क्या करना चाहेंगे? अंतिम परिणाम होना चाहिए line1_$2 - line2_$2 - lineN-$2? क्या आप केवल पहले दो लगातार पंक्तियों को घटाना चाहते हैं?
terdon

जवाबों:


9

तुम भी का उपयोग कर ऐसा कर सकते हैं awk, pasteऔर bc। मुझे यह दृष्टिकोण याद रखने में आसान लगता है, सिंटैक्स की awkहमेशा मुझे पुष्टि करने के लिए चीजों को देखने की आवश्यकता होती है।

नोट: यह दृष्टिकोण 1 से 2, 3, 4, आदि संख्याओं को घटाते हुए, आउटपुट की कई लाइनों के साथ लड़ने में सक्षम होने का लाभ है।

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}' | paste -sd- - | bc
7513404

विवरण

उपरोक्त awkकॉलम का चयन करने के लिए उपयोग किया जाता है जिसमें वे संख्याएँ होती हैं जिन्हें हम घटाना चाहते हैं।

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'
7969084
408432

फिर हम pasteइन 2 मूल्यों को संयोजित करने और उनके बीच माइनस साइन जोड़ने का उपयोग करते हैं।

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- -
7969084-346660

जब हम bcइसे पास करते हैं तो गणना करता है।

$ grep -P 'MemTotal|MemFree' /proc/meminfo | \
    awk '{print $2}'| paste -sd- - | bc
7513404

@terdon - धन्यवाद मुझे लगता है कि संपादित कर रहा था जब तुम यह किया 8-)
SLM

3

विशुद्ध रूप से awk समाधान, कोई निरर्थक बिल्ली या grep कमांड नहीं:

awk '/MemTotal/ {TOT=$2} /MemFree/ {FREE=$2} END {printf("%d kB Used\n", TOT-FREE)}' /proc/meminfo

मैं देख रहा हूँ कि awk_FTW ने मुझे इसके लिए हराया, लेकिन हालाँकि आउटपुट स्वरूपण मैं अच्छा हो सकता था।


3

इसे इस्तेमाल करे:

grep -P 'MemTotal|MemFree' /proc/meminfo | \
awk 'NR==1{s=$2;next}{s-=$2}END{print s}'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.