कॉलम 1 का अधिकतम मान ज्ञात करें और फ़ाइल से कॉलम 2 से संबंधित रिकॉर्ड प्रिंट करें


19

कॉलम 1 से अधिकतम मान कैसे पता करें और संबंधित पथ स्थान को एक फ़ाइल से गूंजें जिसमें एन रिकॉर्ड की संख्या हो।

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

अपेक्षित उत्पादन:

/opt/oracle/app/oracle/product/12.1.0

जवाबों:


23

यह काम करना चाहिए:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

-v max=0सेट चर maxकरने के लिए 0, फिर, प्रत्येक पंक्ति के लिए, पहले क्षेत्र के वर्तमान मूल्य की तुलना में है max। यदि यह अधिक है, maxतो 1 फ़ील्ड के मान पर wantसेट है और वर्तमान लाइन पर सेट है। जब प्रोग्राम ने पूरी फ़ाइल को संसाधित किया है, तो वर्तमान मूल्य wantमुद्रित होता है।

संपादित करें

मैंने awkपहले समाधान का परीक्षण नहीं किया था और इसे प्रदान करना वास्तव में मेरा बुरा था। वैसे भी, जवाब का संपादित संस्करण काम करना चाहिए (इसे ठीक करने के लिए धन्यवाद) और मैंने नीचे भी परीक्षण किया।

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

मैं sortपहले क्षेत्र पर हूँ जहाँ,

  • -एक संख्यात्मक प्रकार निर्दिष्ट करता है।
  • -r निर्दिष्ट करता है सॉर्ट परिणाम उल्टा।
  • -k1,1 सॉर्टिंग के लिए पहला फ़ील्ड निर्दिष्ट करता है।

अब, छँटाई के बाद मैं आउटपुट को पाइप कर रहा हूं और बस पहला परिणाम प्राप्त कर रहा हूं जो मुझे परिणाम में कॉलम 1 के संख्यात्मक उच्चतम मूल्य देगा।

अब, मैं अंत में इसे cutअंतरिक्ष के रूप में निर्दिष्ट सीमांकक के साथ पाइप करता हूं और मुद्रण -f3जो इच्छित आउटपुट है।

परिक्षण

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

अब, उपरोक्त इनपुट के लिए उपरोक्त कमांड चलाने के बाद, मुझे आउटपुट मिलता है,

/Max/number

awk मैक्स स्ट्रिंग फ़ील्ड की तुलना संख्यात्मक रूप से नहीं करता है। क्या इसीलिए आपने दूसरा तरीका दिया है?
सजुकु

7

आप इसके साथ कर सकते हैं AWK

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

यहां प्रत्येक पंक्ति के पहले स्तंभ की तुलना चर के साथ की जाती है max(जो शुरू में 0 है)। यदि पहले कॉलम में एक मान है जिसे maxतब दूसरे कॉलम को वैरिएबल में संग्रहित किया जाता है line, तो यह फ़ाइल की प्रत्येक पंक्ति के लिए जारी रहता है।

फ़ाइल ENDनियम के अंत में lineचर को प्रिंट करने के लिए निष्पादित किया जाता है।



3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
यह काम करना चाहिए, लेकिन अक्षम है, क्योंकि जब कार्य को अधिकतम खोजना होता है तो छंटनी अधिक होती है।
jw013

2

बस आप इसे sortकमांड का उपयोग करके सॉर्ट कर सकते हैं

sort -r version.log | head -n1 | awk '{print $2}'

आउटपुट:

/opt/oracle/app/oracle/product/12.1.0

आप दूसरे मूल्य को प्रिंट करना चाहते हैं केवल इस बिल्ली का प्रयास करें version.log | सॉर्ट -r | सिर -n1 | awk -F "" {{प्रिंट $ 2} '
सुरक्षा जानवर

कृपया अपने टर्मिनल के स्क्रीनशॉट पोस्ट न करें। इसके बजाय बस टेक्स्ट पेस्ट करें। इसके अलावा, इसके लिए कोई ज़रूरत नहीं है cat, सॉर्ट सीधे इनपुट फ़ाइलों को ले सकता है।
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
यह स्वीकार किए गए उत्तर की फिर से हैश की तरह दिखता है? कृपया बताएं कि यह कैसे भिन्न है।
स्टीफन राउच

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