কোনও ফাইলের 5 ম কলাম মানগুলির উপর ভিত্তি করে একটি .CSV ফাইল ফিল্টার করুন এবং সেই রেকর্ডগুলি একটি নতুন ফাইলে মুদ্রণ করুন


16

নীচের ফর্ম্যাটটি সহ আমার কাছে একটি .CSV ফাইল রয়েছে:

"column 1","column 2","column 3","column 4","column 5","column 6","column 7","column 8","column 9","column 10
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23455","12312255564","string, with, multiple, commas","string with or, without commas","string 2","USD","433","70%","07/15/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""
"46476","15467534544","lengthy string, with commas, multiple: colans","string with or, without commas","string 2","CAND","388","70%","09/21/2013",""

ফাইলের 5 ম কলামে বিভিন্ন স্ট্রিং রয়েছে। আমার ৫ ম কলাম মানের উপর ভিত্তি করে ফাইলটি ফিল্টার আউট করা দরকার। বলি, বর্তমান ফাইলটি থেকে আমার একটি নতুন ফাইল দরকার যা এর পঞ্চম ক্ষেত্রে "স্ট্রিং 1" মানের সাথে রেকর্ড রয়েছে।

এর জন্য আমি নীচের কমান্ডটি চেষ্টা করেছিলাম,

awk -F"," ' { if toupper($5) == "STRING 1") PRINT }' file1.csv > file2.csv

তবে এটি আমাকে নিম্নলিখিত হিসাবে একটি ত্রুটি ছুঁড়ে ফেলছিল:

awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error
awk: { if toupper($5) == "STRING 1") PRINT }
awk: ^ syntax error

আমি তখন নিম্নলিখিতটি ব্যবহার করি যা আমাকে বিজোড় আউটপুট দেয়।

awk -F"," '$5="string 1" {print}' file1.csv > file2.csv

আউটপুট:

"column 1" "column 2" "column 3" "column 4" string 1 "column 6" "column 7" "column 8" "column 9" "column 10
"12310" "42324564756" "a simple string with a comma" string 1 without commas" "string 1" "USD" "12" "70%" "08/01/2013" ""
"23455" "12312255564" "string with string 1 commas" "string with or without commas" "string 2" "USD" "433" "70%" "07/15/2013" ""
"23525" "74535243123" "string with commas string 1 "string with or without commas" "string 1" "CAND" "744" "70%" "05/06/2013" ""
"46476" "15467534544" "lengthy string with commas string 1 "string with or without commas" "string 2" "CAND" "388" "70%" "09/21/2013" ""

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

উত্তর:


17
awk -F '","'  'BEGIN {OFS=","} { if (toupper($5) == "STRING 1")  print }' file1.csv > file2.csv 

আউটপুট

"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""

আমি মনে করি এটি আপনি চান


আউটপুটটি হ'ল আমার কীভাবে এটি হওয়া দরকার। আমি '","'সীমানা হিসাবে তৈরি করার কথা ভাবিনি , অন্যথায় এটি আমার সমস্যার সমাধান করত ... দুর্দান্ত সমাধান ...
ধ্রুব

@ ধ্রুব '","'আপনার পূর্ববর্তী প্রশ্নের সর্বাধিক জবাব প্রস্তাবিত হ'ল ডিলিমিটার তৈরি করা :)
টেরডন

@ এটারডন: হ্যাঁ, আমি জানি, তবে আমি যখন বিষয়টি নিয়ে আসছিলাম তখন তা আমার মনে আসেনি। সত্যি বলতে গেলে, আমি ভেবেছিলাম এটি কমান্ডের সাথে কিছু হতে পারে বা
ডিলিমিটরগুলি

2
@ ধ্রুভ বিশদ সম্পর্কে নিশ্চিত নন যেহেতু আপনি কী করতে চাইছেন তা আমি বলতে পারি না তবে আপনার অন্য অবস্থাটি অবশ্যই ভুল wrong আপনি কি y 5 হাইপার্পিয়ন হলে অনি মুদ্রণের চেষ্টা করছেন? যদি তাই হয়, চেষ্টা করুন else{if(toupper($5)=="HYPERION"){print}}। এই মুহুর্তে আমার কম্পিউটারে নয় তাই আমার সিনট্যাক্সটি ভুল হতে পারে তবে আপনি অন্য কোনও বিবৃতিতে শর্ত দিতে পারবেন না।
টেরডন

1
awk -F '","' 'BEGIN {OFS=","} { if (NR==1) {print} else{if (toupper($5) == "STRING 1") print} }' file1
লিমোওয়ালা

2

সিএসভিতে সমস্যাটি হ'ল কোনও মান নেই। আপনার যদি প্রায়শই সিএসভি-ফর্ম্যাট করা ডেটা নিয়ে ডিল করার প্রয়োজন হয় তবে আপনি কেবল ","আপনার ফিল্ড বিভাজক হিসাবে ব্যবহার না করে আরও শক্তিশালী পদ্ধতির সন্ধান করতে পারেন । এই ক্ষেত্রে, পার্লের Text::CSVসিপিএএন মডিউলগুলি এই কাজের জন্য খুব ভালভাবে উপযুক্ত:

$ perl -mText::CSV_XS -WlanE '
    BEGIN {our $csv = Text::CSV_XS->new;} 
    $csv->parse($_); 
    my @fields = $csv->fields(); 
    print if $fields[4] =~ /string 1/i;
' file1.csv
"12310","42324564756","a simple string with a , comma","string with or, without commas","string 1","USD","12","70%","08/01/2013",""
"23525","74535243123","string , with commas, and - hypens and: semicolans","string with or, without commas","string 1","CAND","744","70%","05/06/2013",""

-1
awk 'BEGIN {FS = "," }'  '{ (if toupper($5)  == "STRING 1") print; }'  file1.csv > file2.csv


@ মোহেন -১ কারণ 1) আপনার "পালাতে হবে বা ফাইল ডিলিমেটারের অংশ হিসাবে তাদের বোঝা যাচ্ছে না the ওপি'র অন্যান্য প্রশ্নের উত্তর দেখুন এবং ২) আপনি বাকীনের কমান্ডটি বাকী কমান্ড থেকে পৃথক করছেন যা সম্পূর্ণরূপে এটি ভেঙে দেয় awk 'BEGIN {FS = "," }' '{print $0}', চেষ্টা করুন , আপনি দেখতে পাবেন এটি কোনও আউটপুট উত্পাদন করে না future ভবিষ্যতে, দয়া করে আপনার উত্তরগুলি সেগুলি পোস্ট করার আগে তারা কাজ করে কিনা তা পরীক্ষা করে দেখুন
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.