কমান্ড আর্গুমেন্ট হিসাবে একটি সীমিত পাঠ্য ফাইলটি ব্যাশে পার্স করা


10

আমার মতো একটি পাঠ্য ফাইল বিভক্ত হয়েছে:

field1,field2,field3 
xield1,xield2,xield3 
dield1,dield2,dield3 
gield1,gield2,gield3

এই কলামগুলির প্রত্যেকটি একটি প্রোগ্রামের প্যারামিটার হবে এবং আমি চাই প্রতিটি প্রোগ্রামের জন্য প্রোগ্রামটি কল করা হোক

আমি লুপের জন্য আশা করছিলাম, এরকম কিছু:

for $i in file
    command $field2 -x $field3 -PN -$field1 >> output
done

ব্যাশে এই জাতীয় কিছু অর্জনের সর্বোত্তম উপায় কী হবে?


ক্ষেত্রের সংখ্যা কি অবিচ্ছিন্ন?
জোসেফ আর।

@JosephR। হ্যাঁ তারা, সর্বদা 3
ডিন

উত্তর:


7
while IFS=, read xx yy zz;do
    echo $xx $yy $zz
done < input_file

ক্ষেত্রের সংখ্যা স্থির থাকলে এটি কাজ করা উচিত। পরিবর্তে echoআপনার কমান্ড ব্যবহার করুন।


ধন্যবাদ, আমি এটি চেষ্টা করছিলাম তবে এটি কেবল প্রথম লাইনের জন্য কাজ করছে বলে মনে হচ্ছে। কমান্ড সফল হওয়ার সাথে সাথে এটি পরবর্তীটির চেষ্টা করে না, যদি এটি ব্যর্থ হয় তবে এটি পরবর্তীটি চেষ্টা করবে যদিও ...
ডিন

সাফল্য বলতে আপনি কীভাবে ব্যর্থ বা ব্যর্থ? আপনার আদেশ কি করে?
coffeMug

আমি অনুমান করব যে তিনি যে কমান্ডটি চালাচ্ছেন তা "পড়ুন" কোমন্ডটি পাওয়ার আগে এটি স্ট্যান্ডার্ড ইনপুট পড়ছে।
প্লাগওয়াশ

4

অন্তর্নির্মিত whileসহ আপনার ব্যবহার করা উচিত read:

while IFS= read -r line;do
    fields=($(printf "%s" "$line"|cut -d',' --output-delimiter=' ' -f1-))
    command "${fields[1]}" -x "${fields[2]}" ... # ${fields[1]} is field 2
done < your_file_here

এটি কীভাবে কাজ করে

  • cutবিবৃতি লাইন নেয় এবং বিভেদক দ্বারা নির্দিষ্ট তে এটি splits -d
  • --output-delimiterবিভাজনকারী চরিত্র, যে cutতাই আমরা অ্যারের মধ্যে বিভিন্ন ক্ষেত্রে লাগাতে পারেন এখানে আমরা একটি স্থান নির্বাচন করুন, নির্বাচিত ক্ষেত্র প্রদর্শন করে ব্যবহার করা হবে fields
  • অবশেষে, আমরা সমস্ত ক্ষেত্র চাই (প্রথম ক্ষেত্র থেকে শেষ অবধি) এবং এটিই -f1-খেলতে আসে।
  • অ্যারে ভেরিয়েবলে এখন আপনার বিভিন্ন ক্ষেত্র সঞ্চিত আছে fields, আপনি সিনট্যাক্সের সাথে আপনি যে কোনও নির্দিষ্ট ক্ষেত্রটি অ্যাক্সেস করতে পারবেন ${field[number]}যেখানে numberঅ্যারে ইনডেক্সিং বাশ-এ শূন্য-ভিত্তিক হওয়ায় আপনি যে প্রকৃত ক্ষেত্রের চেয়ে কম চান তা কম।

বিঃদ্রঃ

  • এটি যদি আপনার কোনও ক্ষেত্রে শ্বেত স্পেস থাকে তবে এটি ব্যর্থ হবে।

স্থির সংখ্যক ক্ষেত্রের জন্য

পরিবর্তে আপনি 1_CR এর উত্তরের অনুরূপ কিছু করতে পারেন :

while IFS= read -r line;do
    IFS=, read -r field1 field2 field3 <<-EOI
    $line
    EOI
    command "$field2" -x "$field3" ... 
done < your_file_here

উপরেরটি আরও কোলাহলপূর্ণ মনে হচ্ছে, কেবল বাশ নয়, কোনও পসিক্স-কমপ্লায়েন্ট শেলে কাজ করা উচিত।


এটি যে ফাইলে আমার সমস্যা রয়েছে সেটিতে এটি পড়ছে না, এটি কলামে লাইনটি ভেঙে দিচ্ছে।
ডিন

@ ডিয়ান হ্যাঁ, দুঃখিত। আমি মনোযোগ দিচ্ছিলাম না। এখন কাজ করে।
জোসেফ আর।

@ ডিয়ান দয়া করে আপডেট হওয়া উত্তরটি দেখুন। আমি শীঘ্রই একটি ব্যাখ্যা যুক্ত করব।
জোসেফ আর।

। @JosephR, এটা সেট করে বিভাজন জন্য বহিরাগত সরঞ্জাম ব্যবহার এড়াতে সম্ভব IFSমধ্যে একটি যথাযথ মান readআবাহন
Iruvar

@ 1_CR আমি জানি, ধন্যবাদ আমি কেবল এটি পেয়ে যাচ্ছিলাম :)
জোসেফ আর।

1

আপনি যথাযথভাবে সেট readকরে প্রতিটি লাইনে একটি অ্যারেতে বিভক্ত করতে পারেন ।,IFS

while IFS=, read -r -a input; do
 printf "%s\n" "${input[0]}" "${input[1]}"
done < input.txt

সুতরাং উপরের উদাহরণে, আপনি 0 সূচনা করে প্রতিটি সূচি উপাদানটিকে এর সূচক ব্যবহার করে অ্যাক্সেস করতে পারেন।


1

এই awkওয়ান-লাইনারটি আপনি যা চান তা করবে:

awk -F, '{cmd="echo " $2 " -x " $3 " -PN " $1 ">> output";  system(cmd)}' f.txt

echoআপনার আদেশ এবং f.txtযে ফাইলটি দিয়ে আপনি পুনরাবৃত্তি করতে চান তা দিয়ে প্রতিস্থাপন করুন ।

সংক্ষিপ্ত ব্যাখ্যা: সীমানা হিসাবে -F,সেট ,করা হবে । cmdকমান্ড তোলে এবং কমান্ড system(cmd)কল।


1

gnu সেড পাশাপাশি ব্যবহার করা যেতে পারে।

sed infile -e 's!^\([^,]*\),\([^,]*\),\([^,]*\)$!command \1 -x \2 -PN \3!e' >> output

s কমান্ডের e বিকল্পের ব্যবহার লক্ষ্য করুন

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