ফাইলের বিভিন্ন লাইন বিভিন্ন ভেরিয়েবলে পড়তে হয় কীভাবে?


14

আমি একটি টেক্সট ফাইলের বিভিন্ন লাইন বিভিন্ন ভেরিয়েবলগুলিতে পড়তে চাই। উদাহরণ স্বরূপ

input.txt:

line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar

আমি চাই এই ফলাফল ভেরিয়েবল সংরক্ষণ করার জন্য var1, var2, var3এবং var4যেমন যে

var1=line1 foo foobar bar
var2=line2 bar

ইত্যাদি।

কেউ দয়া করে আমাকে বলতে পারেন কীভাবে এটি সম্পন্ন হয়েছে। আমি evalএকটি লুপের জন্য ব্যবহার করার চেষ্টা করেছি । এটি কাজ করে বলে মনে হচ্ছে না।



3
এটি একটি খারাপ পদ্ধতির। মূলত সেট ভেরিয়েবল একমাত্র কারণ হয় যেহেতু তাদের সাথে কিছু করতে, এবং যেহেতু সেখানে টুলস বিশেষভাবে সংখ্যা বিপুল সংখ্যক হয় পরিকল্পিত একটি ফাইলে টেক্সট প্রতিটি লাইন দিয়ে কিছু করার (awk, কিন্তু, grep, cut, এট। অল।), এটা অনেক অনেক ভালো শুধু এর কি আপনাকে যা করতে হবে তা। শেল স্ক্রিপ্টে মাইক্রো ম্যানেজ করবেন না; কাজটি সম্পন্ন করার জন্য অর্কেস্ট্রেট সরঞ্জামগুলি।
ওয়াইল্ডকার্ড

উত্তর:


20

আপনি করতেন:

unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt

বা:

{ line1=$(line) && line2=$(line); } < input.txt

(কম দক্ষ হিসাবে কম দক্ষ হিসাবে lineঅন্তর্নির্মিত এবং বেশিরভাগ শেল কমান্ড প্রতিস্থাপন বাস্তবায়নের জন্য কাঁটাচামচ করা প্রয়োজন। lineএছাড়াও এটি একটি স্ট্যান্ডার্ড কমান্ড হয় না)।

একটি লুপ ব্যবহার করতে:

unset -v line1 line2 line3
for var in line1 line2 line3; do
  IFS= read -r "$var" || break
done < input.txt

অথবা ভেরিয়েবলের নামগুলি স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত করতে line<++n>:

n=1; while IFS= read -r "line$n"; do
  n=$((n + 1))
done < input.txt

নোট যে bashঅ্যারে ভেরিয়েবল এবং একটি readarrayবিল্টিনকে অ্যারেতে রেখাগুলি পড়তে সমর্থন করে :

readarray -t line < input.txt

নোট অন্যান্য অধিকাংশ শাঁস বিপরীত তবে যে bashঅ্যারে সূচকের 0 না 1 (থেকে উত্তরাধিকারসূত্রে এ শুরু ksh), তাই প্রথম লাইন থাকবে ${line[0]}না ${line[1]}(যদিও হিসাবে @Costas দেখিয়েছেন , আপনি করতে পারেন readarray(ওরফে mapfile) indice এ মান লেখা শুরু 1 ( bashঅন্যান্য অন্যান্য শাঁসের বিরল অ্যারেগুলির বিপরীতেও অ্যারে) এর সাথে -O 1)।

আরও দেখুন: "আইএফএস = পঠন-রেখা" বোঝেন?


12

আমি এই জাতীয় কাজের জন্য অ্যারে ব্যবহার করার প্রস্তাব দেব

mapfile -t -O 1 var <input.txt

তাই আপনি প্রতিটি লাইন আছে ${var[1]}, ${var[2]}এবং তাই


এই ওয়ান-লাইনারটি খুব ভাল কাজ করে। আমার জন্য বিষয়টি সমাধান করুন।
ম্যাট জাবোজনিক

0

এটি আপনি যা চেয়েছিলেন তা কঠোর নয়, তবে এটি আপনার প্রয়োজনের জন্য কাজ করতে পারে। আপনি Awk এর সাহায্যে ডেটা সিরিয়ালাইজ করতে পারেন। মনে রাখবেন যে আপনার $ 1 একটি বৈধ পরিবর্তনশীল নাম না থাকলে এটি ভঙ্গ হবে:

awk '
function quote(str,   d, m, x, y, z) {
  d = "\47"; m = split(str, x, d)
  for (y in x) z = z d x[y] (y < m ? d "\\" d : d)
  return z
}
{
  print $1 "=" quote($0)
}
' input.txt > /tmp/input.sh
. /tmp/input.sh

ফলাফল:

$ echo "$line1"
line1 foo foobar bar

এটি মারাত্মকভাবে অদ্ভুত কোড! দেখা যাচ্ছে আপনি পুরো ইনপুট ফাইলটিকে ব্যাশ স্ক্রিপ্টে পরিণত করার জন্য আপনি জঞ্জাল ব্যবহার করছেন যা আপনি উত্স করেন। কোট () কী করছে সে সম্পর্কে আমার একটি অস্পষ্ট ধারণা আছে। আরও বর্ণনামূলক পরিবর্তনশীল নামগুলি সাহায্য করবে। আপনি কি আরও কিছু ব্যাখ্যা করতে পারেন?
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.