Awk का उपयोग करके निरपेक्ष मूल्य कैसे लें?


14

अगर मेरे पास दो तारीखें हैं:

2015-09-12,2015-08-13

और मुझे उन दोनों के बीच दिनों की संख्या प्राप्त करने की आवश्यकता है, मैं नीचे दिए गए कोड का उपयोग करूंगा:

awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}'

इस कोड के लिए आउटपुट होगा -29जबकि वास्तव में अंतर है29

जवाबों:


23

आप इस awkतरह से कार्यों को परिभाषित कर सकते हैं :

awk -F'[-,]' '
  function abs(v) {return v < 0 ? -v : v}
  {print abs(360*($4-$1)+30*($5-$2)+($6-$3))}'

11

इस तरह की स्थितियों के लिए सामान्य चाल वर्ग की मूल जड़ का उपयोग करना है:

awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}'

3
हालांकि थोड़ा ओवरकिल। ध्यान दें कि sqrt(x^2)ठीक है, लेकिन sqrt(x)^2छोटी त्रुटियों को पेश कर सकता है जो आश्चर्य का कारण बन सकता है। बिजीबॉक्स के लिए awk, यह सक्षम होना चाहिए गणित समर्थन के साथ (उदाहरण के लिए डेबियन पैकेज में डिफ़ॉल्ट नहीं)।
स्टीफन चेजलस

3
Sqrt (x) ^ 2 केवल ऋणात्मक संख्याओं के लिए विफल नहीं होगा?
डैनियल मैक्लॉरी

1
@DanielMcLaury यही कारण है कि sqrt(x^2)
जिमीज

@ जिमीज: मैं आपके जवाब पर टिप्पणी का जवाब दे रहा हूं, खुद जवाब देने के लिए नहीं।
डैनियल मैक्लॉरी


2

यह मानते हुए कि आप GNU पर हैं awk, फंकी mktimeफंक्शन उपयोगी है।

awk -F, '{ gsub(/-/," ",$0);a=(mktime($2 " 23 59 59")-mktime($1 " 00 00 00"))/86400;print a*(a<0?-1:1)}' file.txt
29

1

देर से, लेकिन यहां जीएनयू dateकमांड का उपयोग करके एक समाधान है जो प्रत्येक महीने निश्चित 30 दिनों पर आधारित नहीं है जो कि ऊपर पोस्ट किए गए सभी उत्तर इसे मानते हैं लेकिन स्टीव का जवाब है

awk -F, '{cmd="printf \"%d\n\" $((($(date -d"$1" +%s)-$(date -d"$2" +%s))/86400))"; 
    cmd|getline $0; $0*=($0<0?-1:1); close(cmd)}1' infile

नीचे दिए गए इनपुट के लिए:

2015-09-12,2015-08-13
2017-02-12,2017-03-12

आउटपुट है:

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