একটি কলাম মানের উপর ভিত্তি করে একটি ফাইল থেকে ডেটা বের করুন এবং বিভিন্ন ফাইলগুলিতে রাখুন


14

আমরা নীচের মানগুলির সাথে একটি সিএসভি ফাইল তৈরি করব

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

আমাকে দ্বিতীয় কলামের উপর ভিত্তি করে ডেটা বের করতে এবং ফাইল তৈরি করতে হবে। যদি এটি 577 হয় তবে পুরো লাইনটি বের করে একটি পৃথক ফাইলে স্থাপন করতে হবে। আমি বলতে চাই যে আমার কাছে দ্বিতীয় কলামের একা 577 হিসাবে লাইনের একটি ফাইল রয়েছে এবং দ্বিতীয় কলামের সাথে একা 132 হিসাবে অন্য ফাইল রয়েছে

আমি আইএফ ব্যবহার করার চেষ্টা করেছি কিন্তু কাজ হয়নি


5
আসলে কোডটি পোস্ট করা যা কার্যকর হয় না তা সর্বদা একটি ভাল ধারণা।
স্বর্ণলোকগুলি

উত্তর:


27

ব্যবহার awk:

awk -F, '{ print > $2 ".csv" }' file.csv

এটি দুটি ফাইল 577.csvএবং 132.csvআপনার বর্তমান ডিরেক্টরিতে তৈরি করবে ।

কমান্ড উপরে অনুমান আপনি শুধুমাত্র থাকতে পারে 132বা 577দ্বিতীয় ক্ষেত্র হিসেবে। এটি সম্পূর্ণরূপে দ্বিতীয় ক্ষেত্রে পাওয়া প্রতিটি মানের জন্য একটি ফাইলের নাম তৈরি করবে file.csv

আপনার আগ্রহী দুটি বাদে যদি অন্য মান থাকে তবে আপনি এই লাইনগুলি উপেক্ষা করতে চান, পরিবর্তে এটি করুন:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
বগি awkবাস্তবায়ন রয়েছে যা ব্যবহার করতে পারে না print > $2 ".cvs"। সেই গুলিতে, আপনাকে প্রথমে গনা ফাইলের নাম হবে, তারপর না print: fname = $2 ".cvs"; print > fname
কুসালানন্দ

3

আমি টেরডনের awkসমাধানটি পছন্দ করি , তবে সম্পূর্ণতার জন্য, কেবলমাত্র এটি ব্যবহারের জন্য একটি পরামর্শbash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

এটি ফাইল 577.csvএবং 132.csvবর্তমান ডিরেক্টরিতে উত্পাদন করবে ।


3

স্টডআউটে সমস্ত 577 নিষ্কাশন করতে

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

- 577 সহ লাইনে কমপক্ষে 3 টি কমা যখন মিথ্যা ম্যাচগুলি এড়ানোর জন্য নীচে @ টার্ডনের মন্তব্যের ভিত্তিতে 1 টি সংশোধন করা হয়েছে, সম্পাদনা করুন।

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

তবে আমি মনে করি যে তার awkসমাধানটি আরও ব্যাপক।


577 অন্য মাঠে থাকলেও এটি মিলবে, দ্বিতীয় নয় বা এটি কোনও মাঠের একটি অংশ কিনা। উদাহরণস্বরূপ foo577barবা yp9012,132,8,577
টেরডন

আমি ভেবেছিলাম আমার কমাগুলি এটিকে ক্ষেত্রের অবস্থান নির্ভর করবে?
এক্স টিয়ান

দুঃখিত, আমি খারাপ উদাহরণ দিয়েছি কিন্তু .*কমাগুলিও মিলতে পারে তাই আপনি কোন ক্ষেত্রটি মেলেছেন তা আপনি জানেন না। দ্বিতীয় হতে পারে, 45 তম হতে পারে। আমার দ্বিতীয় অভিযোগটি ভুল ছিল, আপনি ঠিক বলেছেন যে কমাগুলি মিল থেকে রক্ষা করবে foo577bar
টেরডন

কি করলে | অক্ষর পরিবর্তে ব্যবহৃত হয়,।
ব্যবহারকারী3116123

নীচে ত্রুটি গ্রেপ প্রাপ্তি: অবৈধ বিকল্প - ই ব্যবহার: গ্রেপ -hblcnsviw প্যাটার্ন ফাইল। । ।
ব্যবহারকারী3116123

1

ব্যবহার csvkit:

$ csvgrep -c 2 -m 577 data.csv >output.csv

-c 2তোলে cvsgrepদ্বিতীয় কলামে বিবেচনা, এবং সঙ্গে -m 577আমরা স্ট্রিং মেলে এটা জিজ্ঞাসা 577যে কলামে।

নিম্নলিখিতগুলিতে লিখিত হবে output.csv:

yp1234,577,1,3
yp5678,577,3,5

কয়েকটি স্ট্রিংয়ের সাথে মেলে এবং প্রতিটি স্ট্রিংয়ের জন্য একটি ফাইলে আউটপুট লিখুন:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

এটি দুটি ফাইল তৈরি করবে output-132.csvএবং output-577.csv

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