সংখ্যার একটি কলামের দ্রুত গণনা করুন


15

আমি একটি মার্কডাউন টেবিলটি লিখছি যা দেখতে এটির মতো দেখাচ্ছে:

| 13/05/15 | 09:30-16:00 |  6.5 |
| 14/05/15 | 10:00-16:30 |  6.5 |
| 16/05/15 | 15:30-01:00 |  9.5 |
| 21/05/15 | 09:00-16:30 |  7.5 |
| 22/05/15 | 08:30-17:00 |  8.5 |
| 28/05/15 | 09:30-15:30 |  6   |
| 02/06/15 | 09:00-20:00 | 11   |
| 03/06/15 | 08:30-22:30 | 14   |

আমি তৃতীয় কলামটি মোট গণনা করে এটি বাফারে sertোকানোর জন্য একটি উপায় খুঁজছি। আমার মনে যে সমাধানটি রয়েছে তা ভিজ্যুয়াল-ব্লক মোড (সমস্ত নম্বর নির্বাচন করতে) এবং সম্ভবত এক্সপ্রেশন রেজিস্টার (গণিত করতে) ব্যবহার করবে।

দেশী ভিম কমান্ড ব্যবহার করে এটি কি সম্ভব হবে? যদি তা না হয় তবে এমন কোনও প্লাগইন আছে যা আমাকে সাহায্য করতে পারে?


1
আপনি এই নিবন্ধটি একবার দেখে নিতে পারেন: vim.wikia.com/wiki/USS_vim_as_calculator
nobe4

উত্তর:


15

আমি একটি প্লাগইন লিখেছি: https://github.com/sk1418/HowMuch যা ভিজ্যুয়াল নির্বাচনকে সমর্থন করে এবং গণিতের গণনা করে।

ডিফল্টরূপে প্লাগইনটি তিনটি গণিত-এক্সপ্রেশন মূল্যায়ন ইঞ্জিনগুলি সমর্থন করে: Gnu বিসি, পাইথন এবং ভিমস্ক্রিপ্ট। আপনি একটি নির্দিষ্ট গণনা করতে পারেন বা প্লাগইনটি স্বয়ংক্রিয়ভাবে আপনার জন্য একটি চয়ন করতে দেয়।

এটি আপনার উদাহরণের সাথে এটির মতো কাজ করে:

এখানে চিত্র বর্ণনা লিখুন

বিশদ জন্য গিথুব এ README পড়ুন।


আপনি যদি আপনার উত্তরটিতে নির্বাচন, যোগফল এবং সন্নিবেশ করানোর জন্য প্রয়োজনীয় কীস্ট্রোকগুলি অন্তর্ভুক্ত করেন তবে এটি সহায়ক হবে।
pdoherty926

@ pdoherty926 For details please read the README on github.এমনকি আমি যদি এখানে সমস্যার জন্য চাপ দিয়েছি এমন কীস্ট্রোকগুলি রেখেছি তবে এটি কতটা সহায়ক হতে পারে তা আমি দেখতে পাচ্ছি না, এটি কেবল 3 বা 4 কী সংমিশ্রণ। যদি আমার স্ক্রিপ্টটি সত্যিই কারও দ্বারা প্রয়োজন হয় তবে সে যেভাবেই বিশদটি পরীক্ষা করতে পারে।
কেন্ট

12

আপনি যদি প্লাগিন ব্যবহার করতে বা ব্যাশ স্ক্রিপ্টে না যেতে চান তবে আপনি নিম্নলিখিতটির মতো কিছু করতে পারেন:

  • c-V {motions} "ay কলাম কপি "a
  • :let @a = substitute(@a, 'c-V c-J', '+', 'g') কলামটি নতুন লাইনের সাথে প্রতিস্থাপন করুন +
  • ic-R=c-Ra"aএক্সপ্রেশন রেজিস্টার মাধ্যমে প্রতিস্থাপন চালান

বিকল্পভাবে: কলামের আরও পরিমাণের জন্য এক্সপ্রেশন ইতিহাসের এন্ট্রিটিকে পুনরায় ব্যবহারযোগ্য করে তুলুন

  • ctrl-V {motions} y ইয়ঙ্ক রেজিস্টারে কলাম রাখুন ""
  • ictrl-R=eval(substitute(@", '\n', '+', 'g'))

অন্য কলামের জন্য পুনরাবৃত্তি:

  • ctrl-V {motion} y (অপরিবর্তিত)
  • ictrl-R=<CR>অথবা আপনি যদি এক্সপ্রেশন রেজিস্টার দিয়ে অন্য কিছু করে থাকেন তবে উপরের তীর কী (বা ctrl-Pআপনি এটি পুনরায় সরিয়ে রেখেছিলেন) দিয়ে ইতিহাসের চক্রটি চালান:
    ictrl-R=<up>...<up><CR>

1
কিছু কারণে আমি শুধুমাত্র উদ্ধৃতি চিহ্ন সঙ্গে আপনার সমাধান ব্যবহার করতে পরিচালিত "পরিবর্তে একক উদ্ধৃতি 'উপর substituteকমান্ড। আপনি কি জানেন যে এর কোনও কারণ আছে কিনা?
ভ্যাপোলিনারিও

@ ভ্যাপোলিনারিও এটি আমার পক্ষে দুভাবেই কাজ করে, তাই আমি ভয় করি যে আমি জানি না, দুঃখিত sorry
হোভারকচ

@ হোভারকৌচ আপনি কি তৃতীয় ধাপে বিশদ বর্ণনা করতে পারেন? কীভাবে, ঠিক মত, এক্সপ্রেশন রেজিস্টারটির মাধ্যমে প্রতিস্থাপনটি চালানো যেতে পারে?
pdoherty926

কীভাবে মানচিত্র তৈরি করবেন: n nnoremap <cs>: s / $ / \ = eval (বিকল্প (@ 0, '[^ 0-9]', '+', 'জি')) / <সিআর>
Ser

9
:r!awk '{sum+=$6} END {print "Total: "sum}' %

ব্যাখ্যা:

:r ........... read (put result in this file)
! ............ external command
awk .......... external tool
{sum+=$6} .... sixth field (awk considers spaces as field separator)
END .......... at the end
{print "Total: "sum} --> string "Total: " plus your result
% ............ current file

আমি এখানে কাজ করে এমন একটি ফাংশন চেষ্টা করছি:

" This function requires you select the numbers
fun! SumVis()
    try
        let l:a_save = @a
        norm! gv"ay
        let @a = substitute(@a,'[^0-9. ]','+','g')
        exec "norm! '>o"
        exec "norm! iTotal \<c-r>=\<c-r>a\<cr>"
     finally
        let @a = l:a_save
     endtry
endfun
vnoremap <leader>s :<C-u>call SumVis()<cr>

অন্তর্ভুক্ত উপরের মানচিত্রটি ব্যবহার করে, ফাংশনটি লোড করার পরে আপনাকে যা করতে <leader>sহবে তা হল নির্বাচিত অঞ্চলটি যোগ করতে আপনি যে নম্বরগুলি যোগ করতে চান এবং তা ব্যবহার করতে চান তা বেছে নিন।

ফাংশন ব্যাখ্যা:

এটি try/finally/endtryত্রুটিগুলি ক্যাপচার করার জন্য ব্যবহার করে

let l:a_save = @a .......... if whe have register 'a' we save it temporarelly
norm! gv"a  ................................... gv --> reselects and captures selection to 'register a'
let @a = substitute(@a,'[^0-9. ]','+','g') .... removes all but numbers, dots and spaces from 'register a' and puts '+' among the numbers
exec "norm! '>o"  ............................. opens new line bellow selection. see :h '>
exec "norm! iTotal: \<c-r>=\<c-r>a\<cr>" ...... insert "Total: " plus 'expression register result
let @a = l:a_save ............................. restores original 'a' register content

আপনি যদি এই ফাংশনটি চেষ্টা করতে চান তবে নিম্নলিখিতটি করুন: আপনার ব্রাউজারে এই ফাংশনটি অনুলিপি করুন এবং এই আদেশটি ভিমে চালান এটি :@+ আপনাকে :call SumVis()স্বাভাবিকভাবে ব্যবহার করতে দেয় ।

:@+ ......... loads `+` register making the function avaiable

এটির জন্য আপনার ctrl+ + দিয়ে একটি ভিজ্যুয়াল ব্লক নির্বাচন করা v, অনির্বাচিত এবং অবশেষে ফাংশনটি কল করা দরকার। অথবা আপনি প্রস্তাবিত মানচিত্র ব্যবহার করতে পারেন যা গণনা করার আগে নিজেই নির্বাচনটি সরিয়ে দেয়।



5

একটি প্লাগইন তৈরি করা বা এটি উইমস্ক্রিপ্টে কোডিং করা কিছুটা ভারী মনে হচ্ছে। আমি একটি প্লাগইন-মুক্ত ভিএম, এবং বাহ্যিক সরঞ্জামগুলির সাথে ভাল রচনাতে বিশ্বাস করি।

এখানে ব্যবহারকারীর উপর ভিত্তি করে একটি 1-বারের কমান্ড রয়েছে 2571881 এর, এটি কাজ করে এমনকি যদি বাফারটি সংরক্ষণ না করা হয়।

:%!awk -F '|' '{print; sum+=$4}; END {print "Total: "sum}'

আপনি যদি ভবিষ্যতে ব্যবহারের জন্য এই আদেশটি সংরক্ষণ করতে চান তবে আপনি এটির নাম রাখতে পারেন:

:command! -range=% -nargs=1 SumColumn <line1>,<line2>!awk -F '|' '{print; sum+=$('<args>' + 1)} END {print "Total: "sum}'

এটি ভিজ্যুয়াল নির্বাচনের সাথে কাজ করে। যদি আপনি কয়েকটি সারি নির্বাচন করেন এবং কমান্ড মোডে যান, ভিম আপনার কমান্ডের সাথে উপসর্গ করবে :'<,'>, যা ভিজ্যুয়াল নির্বাচনের জন্য লাইন রেঞ্জ। সুতরাং আপনি চালাতে পারেন:

:'<,'>SumColumn 3

এবং এটি কেবল নির্বাচিত সারিগুলির তৃতীয় কলামের যোগফল করবে। ডিফল্টরূপে পরিসীমা হয় %, তাই

:SumColumn 3

সমস্ত লাইনের তৃতীয় কলামের যোগফল করবে।

সম্পাদনা: আপনি যদি অন্য ক্ষেত্রের বিভাজক নির্দিষ্ট করতে এবং শেষের হিসাবে গণনা করা কলামটি ডিফল্ট করতে চান, আপনি কমান্ডটি কভার করতে পারেন bashএবং এর সাথে যুক্তিগুলি হ্যান্ডেল করতে পারেন:

:command! -range=% -nargs=* SumColumn <line1>,<line2>!bash -c 'awk -F ${2:-|} "{print; sum+=\$(${1:-NF - 2} + 1)} END {print \"Total: \"sum}"' sumcolumn <args>

এখন,

:SumColumn

"|" দিয়ে একটি সারণির শেষ কলামটি গণনা করবে ক্ষেত্র বিভাজক,

:SumColumn 3

"|" সহ একটি সারণীর তৃতীয় কলাম গণনা করবে ক্ষেত্র বিভাজক, এবং

:SumColumn 3 +

ফিল্ড বিভাজক সহ একটি সারণীর তৃতীয় কলাম গণনা করবে।


কীভাবে একজন অন্য সম্ভাব্য ক্ষেত্র বিভাজকগুলির সাথে ডিল করতে পারে? সমাধানটিকে আরও জেনারিক করার জন্য।
সেরজিওআরাউজো

@ ব্যবহারকারী 2571881, আমি উত্তরটি সম্পাদনা করেছি, এটি দেখিয়ে।
JoL

ভিওএমআরসি-র মতো ফাংশনগুলি যোগ SumColumnকরার অর্থ জোম আপনার ভিআইএমআরসিতে কেবল 'প্লাগইন' রয়েছে। আশা করি, আপনি সময়ের সাথে এটি বজায় রাখতে পারদর্শী। আমার জন্য প্লাগইনগুলি অন্যের সদ্ব্যবহারের সুযোগ নিয়ে ডকুমেন্টেশন, অর্থপূর্ণ অংশগুলিতে পৃথকীকরণ সরবরাহ করে। আমি প্রবাহে অবদান রাখি যা আশ্চর্যজনক প্লাগইনগুলিকে উন্নতি করে যা কারও কাছে নিজেরাই সেগুলি তৈরি করার সময় নেই (টপোপ ব্যতীত)। আপনি কি ভিম-সাইড, ভিম-পলাতক, ভিম-ইজি-এলাইন / ভিম-সিংহ, ভিম-অ্যামপেইয়ার্ড, ভিম-মন্তব্য, আল্টিসনিপস বা এফটি-নির্দিষ্ট কোনগুলি যেমন ভিম-গো, উইম-রেলস, ভিমেটেক্স ব্যবহার করেন না?
হটস্কে

@ হটস্কে আমি যখন এখানে এসেছি, তখন আমি প্রশ্নটি দেখেছি এবং ভেবেছিলাম, "ভাল, কেবল উত্তেজিত হয়ে পাইপ"। তবে, আমি স্বীকৃত উত্তরটি দেখেছি, "আরে, এই শত শত এলওসি প্লাগইন ডাউনলোড করে ইনস্টল করুন।" তৃতীয় উত্তর ছিল, "ওহে, এই হাজার হাজার এলওসি প্লাগইন ডাউনলোড করুন এবং এটি ইনস্টল করুন।" এটি ওভারকিল এবং ফোলা আপনার জীবনে একাধিকবার কলামের যোগফল প্রয়োজন হলেও এটি অতিমাত্রায়। আমার উত্তরটি বোঝানো হচ্ছে আপনি কীভাবে এটি একক নো-প্লাগইনগুলিতে করতে পারেন, নন-ননসেন্স কমান্ড যদি আপনাকে কেবল একবার এটি করতে হয় এবং আপনি যদি এটি করার প্রয়োজন হয় তবে আপনি কীভাবে এটির পরামিতিগুলি সহ একটি সাধারণ কমান্ড তৈরি করতে পারেন show প্রায়ই।
জোল

@ হটসকে আপনার প্রশ্নের জবাব দিতে আমি সূর্যের নীচে প্রতিটি প্লাগইন ইনস্টল করতাম যা দূর থেকে শীতল লাগছিল তবে আমার ভিমটি অবিশ্বাস্যভাবে ধীর ছিল ("সামান্য ল্যাগি" পড়ুন যা সম্পাদকের পক্ষে অসহনীয়)। ভিএম ডক্সে আরও সন্ধান করার পরে, আমি বুঝতে পারি যে আমার সত্যিই প্লাগিনগুলির দরকার নেই। অনেকগুলি স্টক বৈশিষ্ট্যই যথেষ্ট ভাল ছিল এবং ভিমে যেগুলি ছিল না তাদের পক্ষে শেলটি যাওয়ার উপায় ছিল। মূলত (এটির ব্যতিক্রমগুলি উপেক্ষা করে), ইউনিক্স দর্শনের মতে, ভিএম এমন সম্পাদক যা অন্যান্য ওএস টুলিংয়ের সাথে ভালভাবে আন্তঃব্যবহার করে। আমি বিশ্বাস করি যে এটি সর্বোত্তমভাবে ব্যবহারের উপায় way এর পর থেকে কোনও প্লাগইন নেই।
জোল

2

যদি কলামগুলি যথাযথভাবে সংযুক্ত থাকে, তবে এটি একটি সাধারণ অনেলনারের সাহায্যে করা যেতে পারে।

  1. অন্যান্য উত্তরগুলি যেমন প্রদর্শন করেছে -> + কার্সারটি সরান তেমন প্রথমে কলামটি ব্লক-ভিত্তিক ভিজ্যুয়াল মোডে নির্বাচন করুনCTRL-V
  2. নির্বাচনটি ইঙ্ক করে দিয়ে দিন y
  3. টাইপ করুন: :echo eval(join(split(@", '\_s\+'), '+'))যা ফাঁকা স্থান এবং নতুন লাইনে ইঙ্কিত পাঠ্যকে বিভক্ত করে, উপাদানটি +চরিত্রের সাথে আবার যোগদান করুন এবং স্ট্রিংটি মূল্যায়ন করুন।
  4. এগিয়ে যাওয়ার আরেকটি উপায়: নতুনলাইনগুলি প্রতিস্থাপন করুন +এবং মূল্যায়ন করুন: :echo eval(substitute(@", "\n", '+', 'g'))- eval()আমাদের কাছে নিকটতম জিনিস reduce

যদি তা না হয় তবে আপনাকে ক্ষেত্রগুলি গণনা করতে অন্যান্য কৌশল ব্যবহার করতে হবে। উদাহরণস্বরূপ, split(getline('.'), "[ \t|]\\+")আপনার অ্যারেতে একটি সারি থেকে কলামগুলি বিভক্ত করতে ব্যবহার করা যেতে পারে। সেখান থেকে এটি এতটা সহজ হয়ে যায়:

  1. ভিজ্যুয়াল মোডে আপনার লাইনগুলি নির্বাচন করুন
  2. :echo eval(join(map(getline("'<", "'>"), { -> split(v:val, "[ \t|]\\+")[2] }), '+'))

Theন্দ্রজালিক মানগুলি থেকে মুক্তি পাওয়ার জন্য (ক্ষেত্রের নম্বর - 1, এবং +), এটি একটি আদেশ হতে পারে

:command! -range=% -nargs=+ OnField 
    \ echo { field, what -> eval(join(map(getline(<line1>, <line2>), { -> split(v:val, "[ \t|]\\+")[field-1] }), what))}(<f-args>)

যা এর সাথে ব্যবহার করা যেতে পারে:

:OnField  3 +
:2,5OnField  3 +
:'<,'>Onfield 3 *   " after line-wise selection
....

দ্রষ্টব্য: এখানে আমি Vim 7.4.1xxx থেকে ল্যাম্বডাস ব্যবহার করি


1

vmap ++প্লাগইন থেকে vmathড্যামিয়েন: Conway দ্বারা

  1. গিথুব থেকে প্লাগইন ইনস্টল করুন (কেবল 178 স্লোক) যেমন

    $ wget https://raw.githubusercontent.com/thoughtstream/Damian-Conway-s-Vim-Setup/master/plugin/vmath.vim -P ~/.vim/pack/manual/start/damians-tools/plugin
    
  2. আপনার vimrc এ ম্যাপিং যুক্ত করুন

    vmap <silent><expr>  ++  VMATH_YankAndAnalyse()
    

    তবে, আমি অন্য কিছু ব্যবহার করার পরামর্শ দেব, যেমন eg gA

  3. তৃতীয় কলমে চলে যান 2f|এবং ভিজ্যুয়াল-ব্লক মোডে কলামটি নির্বাচন করুন<C-V>G$
  4. টিপুন ++(বা আপনার নির্বাচিত ম্যাপিং)
  5. ফলাফলগুলি নিবন্ধগুলিতে দেখানো এবং সংরক্ষণ করা হয় (সমষ্টি s)
  6. রেজিস্টার থেকে যোগ সন্নিবেশ s, যেমন সহ"sp

এই প্লাগইনটির উপস্থাপনার জন্য ইউটিউব ভিডিও ড্যামিয়ান কনওয়ে, "আরও তাত্ক্ষণিকভাবে আরও ভাল ভিম" - ওএসকন 2013 (29 মিনিটের শুরুতে) দেখুন।


1

সিএসভিকিটcsvstat থেকে বাহ্যিক ক্লাইট সরঞ্জাম

:!csvstat -d '|' -H -c 4 --sum %
69.5

বিকল্পগুলির সংক্ষিপ্ত ব্যাখ্যা

  • -d DELIMITERইনপুট সিএসভি ফাইলের সীমানা চরিত্র। এখানে |
  • -H উল্লেখ করুন যে ইনপুট সিএসভি ফাইলের কোনও শিরোনাম সারি নেই।
  • -c COLUMNSকলাম সূচক বা পরীক্ষাগুলির নামগুলির একটি কমা দ্বারা পৃথক করা তালিকা। সমস্ত কলামে ডিফল্ট।
  • --sum কেবলমাত্র আউটপুট যোগফল।

এই সরঞ্জামটি ন্যূনতম, সর্বোচ্চ, গড়, মধ্যমা, স্টাডিভ (স্ট্যান্ডার্ড বিচ্যুতি) প্রদান করে, অনন্য মান গণনা করে, ঘন ঘন মানগুলির তালিকা করে।

ফাইল সহ .োকান

<C-r>=system("csvstat -d '|' -H -c 4 --sum FILENAME 2> /dev/null")  

স্থাপন

ম্যাকোএস সিএসভিকিট-হোমব্রিউ এবং ডেবিয়ান / উবুন্টুতে পাওয়া যায় এবং এর সাথে এটি ইনস্টল করা যায় $ sudo apt install csvkit

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.