Awk ব্যবহার করে কীভাবে পরম মান নিবেন?


14

আমার যদি দুটি তারিখের নিচে থাকে:

2015-09-12,2015-08-13

এবং তাদের মধ্যে দিনের সংখ্যা পাওয়া দরকার, আমি নীচের কোডটি ব্যবহার করব:

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

এই কোডের ফলাফল আউটপুট হবে -29যখন আসলে পার্থক্য29

উত্তর:



11

এই ধরণের পরিস্থিতিতে সাধারণ কৌশলটি হল বর্গক্ষেত্রের বর্গমূল ব্যবহার করা:

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

3
কিছুটা ওভারকিল যদিও। নোটটি যে sqrt(x^2)ভাল, তবে sqrt(x)^2ক্ষুদ্র ত্রুটিগুলি উপস্থাপন করতে পারে যা বিস্মিত হতে পারে। ব্যস্তবক্সের জন্য awk, এটি গণিত সমর্থন সক্ষম করে তৈরি করা দরকার (উদাহরণস্বরূপ ডেবিয়ান প্যাকেজগুলিতে ডিফল্ট নয়)।
স্টাফেন চেজেলাস

3
স্কয়ার্ট (এক্স) ^ 2 কেবল নেতিবাচক সংখ্যার জন্য ব্যর্থ হবে না?
ড্যানিয়েল ম্যাকলারি

1
@DanielMcLaury যে কেন এটা sqrt(x^2)
জিম্মিজ

@ জিম্মিজ: আমি আপনার উত্তরের মন্তব্যে জবাব দিচ্ছি, নিজের উত্তরে নয়।
ড্যানিয়েল ম্যাকলারি

3

অন্য উপায়:

awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}'

এটি সম্ভবত সবচেয়ে দক্ষ (পারফরম্যান্স) উত্তর।
হাস্তুর

2

ধরে নিচ্ছেন আপনি জিএনইউতে রয়েছেন 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.