নির্দিষ্ট কলামে সারিগুলির নির্দিষ্ট মান রয়েছে কীভাবে গ্রেপ করবেন?


9

নিম্নলিখিত হিসাবে আমার একটি ফাইল আছে

  200.000    1.353    0.086
  200.250    1.417    0.000
  200.500    1.359    0.091
  200.750    1.423    0.000
  201.000    1.365    0.093
  201.250    1.427    0.000
  201.500    1.373    0.093
  201.750    1.432    0.000
  202.000    1.383    0.091
  202.250    1.435    0.000
  202.500    1.392    0.087
  202.750    1.436    0.000
  203.000    1.402    0.081
  203.250    1.437    0.001
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045  

আমি প্রথম কলামে দশমিক .000 এবং .500 কেবলমাত্র সারিগুলিকে গ্রেপ করতে চাই তাই কেবল আউটপুটটি এরকম হবে

  200.000    1.353    0.086
  200.500    1.359    0.091
  201.000    1.365    0.093
  201.500    1.373    0.093
  202.000    1.383    0.091
  202.500    1.392    0.087
  203.000    1.402    0.081
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045  

2
এটি যথেষ্ট সহজ দেখাচ্ছে। এ পর্যন্ত কি কি চেষ্টা করেছ? আপনার কোডটিতে কি সমস্যা ছিল?
1024

সম্ভবত এটি আপনার পক্ষে সহজ তবে আমি গ্রেপ '.000' | দিয়ে চেষ্টা করেছি , grep '.005' কিন্তু এটি সারি অন্যান্য কলামে একই মান আছে বাছাই করে
মোহসেন এল-Tahawy

3
খুব ভালো. আপনি যদি সমস্যাটি নিজেই সমাধান করার জন্য একটি সৎ প্রচেষ্টা দেখান তবে এখানকার লোকেরা আরও বেশি সহানুভূতিশীল। আপনার মন্তব্যে কোডটি এটি দেখায়। ভবিষ্যতে, আপনি যদি আপনার প্রশ্নে এর মতো প্রচেষ্টা অন্তর্ভুক্ত করেন, আপনি সম্ভবত আরও ভাল প্রতিক্রিয়াগুলি দ্রুত পাবেন।
1024

উত্তর:


14

আপনি গ্রেপ ব্যবহার করবেন না। ব্যবহার awk

"your data" | awk '$1 ~ /\.[05]00/'

খুব ভালো. লিখিত হিসাবে, কোড দশমিকের পরে ঠিক তিনটি অঙ্কের উপর নির্ভর করে। এটি ব্যবহার করা আরও দৃust় হবে awk '$1 ~ /\.[05]0*$/'
1024

1
@ জন ১০২৪, আসলে লিখিত কোডটি দশমিকের পরে কমপক্ষে তিনটি অঙ্কের উপর নির্ভর করে । আমি awk '$1 ~ /\.[05]00$/'নিজের দিকে ঝুঁকতে থাকি (ঠিক তিনটি অঙ্কের প্রয়োজন), যদি না আমার মনে হয় যে ইনপুটে পরিবর্তনশীল দশমিক স্থান আশা করা যায়।
ওয়াইল্ডকার্ড

2
@ উইল্ডকার্ড যদি তিনজনের বেশি থাকে তবে কোডটি ব্যর্থ হতে পারে। উদাহরণস্বরূপ: echo 0.5001 | awk '$1 ~ /\.[05]00/'ঠিক তিনটি থাকলে এটি নির্ভরযোগ্যভাবে কাজ করে ।
1024

4
awk '$1 ~ /\.[50]00/ { print $0 }' myFile.txt

প্রথম কলামটি বিন্দুগুলির $1সাথে মিলে /\.500|\.000/যাবে আক্ষরিক বিন্দু হওয়ার জন্য পালিয়ে যায় কোনও অক্ষরকে ~আংশিক মিলের সাথে তুলনা না করে পুরো লাইনটি মুদ্রণ করে$0


2
অন্তর্ভুক্ত করার কোনও কারণ নেই { print $0 }; এটি আউকের ডিফল্ট ক্রিয়া।
ওয়াইল্ডকার্ড

4

আমি প্রথম কলামে দশমিক .000 এবং .500 রয়েছে এমন কেবল সারিগুলি গ্রেপ করতে চাই

আমার প্রথম চিন্তা

grep '^ *[0-9][0-9][0-9]\.[50]00' filename

ডাব্লুএসএল ব্যবহার করে দ্রুত পরীক্ষা করা

$ head testdata
              200.000    1.353    0.086
              200.250    1.417    0.000
              200.500    1.359    0.091
              200.750    1.423    0.000
              201.000    1.365    0.093
              201.250    1.427    0.000
              201.500    1.373    0.093
              201.750    1.432    0.000
              202.000    1.383    0.091
              202.250    1.435    0.000
$ grep '^ *[0-9][0-9][0-9]\.[50]00' testdata
              200.000    1.353    0.086
              200.500    1.359    0.091
              201.000    1.365    0.093
              201.500    1.373    0.093
              202.000    1.383    0.091
              202.500    1.392    0.087
              203.000    1.402    0.081
              203.500    1.412    0.073
              204.000    1.423    0.065
              204.500    1.432    0.055
              205.000    1.441    0.045

এটি প্রকাশ করার আরও সংক্ষিপ্ত উপায় রয়েছে।

$ grep -E '^ *[0-9]{3}\.[50]00' testdata
              200.000    1.353    0.086
              200.500    1.359    0.091
              201.000    1.365    0.093
              201.500    1.373    0.093
              202.000    1.383    0.091
              202.500    1.392    0.087
              203.000    1.402    0.081
              203.500    1.412    0.073
              204.000    1.423    0.065
              204.500    1.432    0.055
              205.000    1.441    0.045

যদি প্রথম কলামে 3-অঙ্কের পূর্ণসংখ্যার অংশ ছাড়া অন্য থাকতে পারে

grep -E '^ *[0-9]+\.[05]00' testdata

কিছু পরিস্থিতিতে আপনার [:digit:]জায়গায় ব্যবহারের প্রয়োজন হতে পারে [0-9]

ইত্যাদি।

man grep তোমার বন্ধু.


এই ব্যবহারটি grepআমার চেয়ে ব্যবহার করা সহজ। আমি আগে এই উত্তরটি দেখলে আমার উত্তর পোস্ট করা হত না। সুন্দর কাজ!
ইয়োকাই

2

আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে আপনি প্রকৃত সংখ্যাসূচক অপারেশনগুলিও ব্যবহার করতে পারেন:

$ awk '{a = $1 % 1} a == 0 || a == 0.5' /tmp/foo
  200.000    1.353    0.086
  200.500    1.359    0.091
  201.000    1.365    0.093
  201.500    1.373    0.093
  202.000    1.383    0.091
  202.500    1.392    0.087
  203.000    1.402    0.081
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045

BSD awk (OSX এল ক্যাপিটান, 20070501) এবং GNU awk 4.1.4 এর সাথে পরীক্ষিত।


1
সতর্কতা: ভাসমান-পয়েন্টের সঠিক সমতা পরীক্ষা করে (যা প্রত্যাহার ব্যবহার করে) প্রায়শই 'ভুল' ফলাফল দেয় যদি না মানগুলির ভগ্নাংশ থাকে (এবং প্রস্থে খুব বেশি বড় না হয়), অথবা ভগ্নাংশটি 'বাইনারি' হয় (ঠিক অর্ধেক, একটি ত্রৈমাসিক ইত্যাদি) যা এই প্রশ্নটিতে থাকা তথ্যের জন্য সত্য তবে অবিচ্ছিন্নর মতো দেখা যায় এমন অনেকগুলি নয়।
dave_thompson_085

1
@ ডেভ_থমপসন ৮০৮ প্রকৃতপক্ষে, তবে গোকের সাহায্যে আপনি স্বেচ্ছাচারিত নির্ভুলতা পাটিগণিত ব্যবহার করতে পারেন , অবশ্যই আমি সেগুলি এখানে ব্যবহার করছি না।
মুড়ু


2

সহ awk:

$>awk '$1%.5==0' data.tsv 
200.000 1.353   0.086
200.500 1.359   0.091
201.000 1.365   0.093
201.500 1.373   0.093
202.000 1.383   0.091
202.500 1.392   0.087
203.000 1.402   0.081
203.500 1.412   0.073
204.000 1.423   0.065
204.500 1.432   0.055
205.000 1.441   0.045

সহ mlr:

$>mlr --ifs tab --onidx filter '$1%.5==0' data.tsv 
200.000 1.353 0.086
200.500 1.359 0.091
201.000 1.365 0.093
201.500 1.373 0.093
202.000 1.383 0.091
202.500 1.392 0.087
203.000 1.402 0.081
203.500 1.412 0.073
204.000 1.423 0.065
204.500 1.432 0.055
205.000 1.441 0.045

2

ঠিক আছে, আমার অবদানের জন্য কিছুটা দেরি করা, তবে আমি মনে করি এটি মূল্যবান।

প্রতিটি ওপিতে পূরণের প্রয়োজনীয়তা হ'ল প্রথম কলামটি হ'ল দশমিক মান .000বা .500কেবল only সীমানা বা দৈর্ঘ্য দ্বারা অগ্রণী মান হিসাবে কোন শর্ত নেই। বলিষ্ঠতার জন্য এটি প্রথম কলামটি সামনে কোনো নন-ফাঁকা অক্ষর (বা এটা এখন আর প্রথম কলামে এর) এবং আছে ছাড়া কিছু দ্বারা সীমাবদ্ধ অবস্থায় গণ্য করা করা উচিত নয় প্রথম কলামে বিষয়বস্তু হবে একটি দশমিক বিন্দু আছে, ., এটি কোথাও।

ওপি ব্যবহার অনুপস্থিত grep, যা পুরো লাইন প্রিন্ট হবে যখন একটি মিল খুঁজে পাওয়া যায় তা করার একমাত্র জিনিস প্যাটার্ন মিল সৃষ্টি হয় সব এবং শুধুমাত্র কি প্রয়োজন হয়।

সরলতা নিজেই, এবং ব্যবহার করার কোনও কারণ sedবা awkp গ্রেপ কোনও ফাইল বা পাইপ হিসাবে উত্সটি পরিচালনা করতে পারে না।

করার grepএকটি ফাইল ব্যবহারgrep '^[^.]*\.[05]0\{2\}\s' the_file.txt

করার grepএকটি নল, ব্যবহার থেকেmy_command | grep '^[^.]*\.[05]0\{2\}\s'

প্যাটার্নটি হ'ল:, ^লাইনের শুরুতে শুরু করুন; [^.], কোনও দশমিক নয় অক্ষরের সাথে মেলে; *, যতবার সম্ভব সম্ভব (কোনওটি নয়); \., একটি দশমিক পয়েন্ট মেলে; [05], একটি পাঁচ বা একটি শূন্য মেলে; 0\{2\}, আরও 2 টি শূন্যের সাথে মেলে (খোলা এবং বন্ধ বন্ধনীগুলির আগে ব্যাকস্ল্যাশগুলি শেলটিকে ব্রেস প্রসারণ করার চেষ্টা থেকে বিরত রাখে); \s, একটি শ্বেত স্পেস অক্ষরটির সাথে মিল দিন (কলামের শেষের অর্থ - ভিন্ন ব্যবহারের ক্ষেত্রে ব্যবহার করতে, কলাম বিভাজক, সাধারণত একটি কমমান, একটি আধা-কোলন বা একটি ট্যাব প্রতিস্থাপন \t)।

দ্রষ্টব্য যে এটি ওপি যা বলেছিল ঠিক তার সাথে মিলবে । এটা করবে না না মেলে .5000অথবা .0000যদিও সংখ্যাসূচকভাবে সমতুল্য, কারণ একটি পাঁচ বা একটি শূন্য জন্য প্যাটার্ন সৌন্দর্য, ঠিক দ্বারা অনুসরণ 2 আরো শূন্য হোয়াইটস্পেস করে। যদি তা তাৎপর্যপূর্ণ হয়, তবে অন্য সমস্ত উত্তর, এখন পর্যন্ত, ব্যর্থ হবেন যে তারা পরীক্ষার অঙ্কের পরে 1 এরও বেশি, কোনও শূন্যের সাথে মিলবে। আর FloHimself দ্বারা উত্তর ছাড়া, তারা ম্যাচ হবে কিছু দ্বিতীয় কলামে যে শুরু .000 বা .500সহ .0003এবং .500T, এবং FloHimself পর এক কিছু মেলে করবে গাণিতিকভাবে সমতূল্য .0এবং.5, সেখানে যত জিরো থাকুক না কেন। শেষটি, ওপি যা বলেছে তার সাথে মেলে না কেন সম্ভবত ওপিকে যা প্রয়োজন তা মেলাতে পারে।

অবশেষে, awkওপি চাইলেও, যদি শক্তি, এবং গতির গতি পছন্দ হয় grep, তবে আদেশটি হ'ল :

একটি ফাইল সহ awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt

একটি পাইপ দিয়ে my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'


1

আপনি যদি গ্রিপ ব্যবহারের জন্য জেদ করেন, তবে এটি আপনার পক্ষে কার্যকর হতে পারে। আপনার দেওয়া প্রথম আউটপুট আমি "file.txt" নামক একটি পাঠ্য ফাইলকে সংরক্ষণ করেছি এবং তারপরে নিম্নলিখিত কমান্ডটি ব্যবহার করেছি:

grep -e '2[^ ]*.000' file.txt & grep -e '2[^ ]*.500' file.txt

যা এর ফলাফল দেয়:

200.000    1.353    0.086
200.500    1.359    0.091
201.500    1.373    0.093
201.000    1.365    0.093
202.500    1.392    0.087
202.000    1.383    0.091
203.500    1.412    0.073
203.000    1.402    0.081
204.500    1.432    0.055
204.000    1.423    0.065
205.000    1.441    0.045

যদি কোনও ফাইলটিতে ইতিমধ্যে থাকে তবে আপনাকে কোনও আউটপুট সংরক্ষণ করতে হবে না save তবে যদি এটি কোনও ফাইলে সংরক্ষণ না করা হয়, আপনি যে গ্রেপ কমান্ডটি দিয়েছিলেন সেটিতে আপনি ডেটাটি পাইপ করতে পারেন এবং এটি কমপক্ষে প্রথম সংখ্যা হওয়া পর্যন্ত কাজ করা উচিত 2, প্রথম কলামে আর হয় না 2। সেই সময়টি সঠিকভাবে মুদ্রণের জন্য আপনাকে উপযুক্ত অক্ষরের সাথে গ্রেপ কমান্ডটি আপডেট করতে হবে।

এই ডুয়াল grepকমান্ডটি দিয়ে যা ঘটছে তা হ'ল প্রথমটি অপারেটরের grepসাথে পটভূমিতে প্রেরণ করা হচ্ছে &। এটি ব্যাকগ্রাউন্ডে প্রেরিত হওয়ার সাথে সাথে পরবর্তী grepকমান্ডটি আপনাকে অভিন্ন আউটপুট দেওয়ার সাথে সাথেই সম্পাদন করে। আরও সহজে কাজটি সম্পন্ন করার জন্য আপনার যে কাজটি শেষ করা দরকার, তার জন্য অন্যরা যে উদাহরণ দিয়েছে এবং ব্যবহার করেছে awkবা এমনকি এটি আপনারও অনুসরণ করা উচিত sed

(সম্পাদনা)

এটি কোনওভাবেই আপনার প্রয়োজনের জন্য গ্রেপের সর্বোত্তম বা কার্যকর ব্যবহার নয় তবে আপনার জন্য কিছুটা খেলা এবং গ্রেপের আরও ভাল অনুভূতি পাওয়ার পক্ষে পর্যাপ্ত পরিমাণে হওয়া উচিত।


প্রথম প্রক্রিয়াটি ব্যাকগ্রাউন্ডে চলবে তবে ডেমোনাইজ করা হয়নি যা পটভূমিতে চলমান অন্তর্ভুক্ত তবে আরও কিছুটা বেশি। এবং ইনপুট হিসাবে একই ক্রমে আউটপুট উত্পাদন করা খুব সম্ভব নয়; এমনকি আপনার বেশিরভাগ উদাহরণে এটি তৃতীয় লাইনে ইতিমধ্যে ভুল হয়ে গেছে।
dave_thompson_085

তিনি উল্লেখ করেননি যে আউটপুটটি একটি নির্দিষ্ট ক্রমে হওয়া দরকার। এটি কেবলমাত্র প্রথম কলামের .500এবং .000এর সাথে নির্দিষ্ট হওয়া দরকার । এটি যদি কোনও নির্দিষ্ট ক্রমে যেমন কমপক্ষে থেকে বৃহত্তর হয়ে থাকে তবে এটি সহজেই করা যায়। তবে মুদ্রিত হওয়া প্রথম কলামের প্রথম 3 টি সংখ্যা সর্বনিম্ন বৃহত ক্রমে। এটি ফলাফল 2[^ ]*.000এবং 2[^ ]*.500। ওপি যা চেয়েছিল তা এটি বেশ মানানসই।
ইয়োকাই

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