ফাইলটি বিভক্ত করুন এবং এটি সম্পর্কিত ডেটা কাঠামোতে রাখবেন?


10

আমার কাছে একটি ফাইল রয়েছে যার নীচে একক লাইন রয়েছে:

{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}

এতে আমার দুটি ডেটাসেট রয়েছে:

machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]

এখন, আমাকে উপরের ফাইলটি পড়তে হবে এবং এটিকে এমনভাবে বিভক্ত করতে হবে যে আমি উপরে উল্লিখিত প্রতিটি মেশিনের তথ্য বের করতে এবং এটি কোনও ডেটা স্ট্রাকচারে সঞ্চয় করতে পারি।

ব্যাশ শেল স্ক্রিপ্টে আমার কোন ডেটা স্ট্রাকচারটি ব্যবহার করা উচিত তা নিয়ে আমি এখন বিভ্রান্ত। আমি যদি জাভাতে এটি করছিলাম Map<String, Set<String>>তবে আমি ব্যবহার করব তবে শেল স্ক্রিপ্টে আমার কী ব্যবহার করা উচিত তা আমি নিশ্চিত নই।

এবং এটি কিছু ডেটা স্ট্রাকচারে সঞ্চয় করার পরে, আমাকে এটি পুনরাবৃত্তি করতে হবে এবং ফলাফলটি মুদ্রণ করতে হবে।

আমি নীচের শেল স্ক্রিপ্ট ব্যবহার করে উপরের ফাইলটি পড়তে সক্ষম:

#!/bin/bash

while read -r line; do
       echo "$line"
    done < data.txt

তবে আমি নিশ্চিত নই যে কীভাবে উপরের রেখার ডেটাগুলি বিভক্ত করব যাতে আমি প্রতিটি মেশিন ইনফরমিটনটি বের করতে এবং তারপরে এটি কোনও ডেটা স্ট্রাকচারে সঞ্চয় করতে সক্ষম হয়েছি?

হালনাগাদ:-

নীচে আমার শেল স্ক্রিপ্টটি গ্লেনের দেওয়া পরামর্শ অনুসরণ করার পরে পেয়েছি -

#!/bin/bash

while read -r line; do
       echo "$line"
       declare -A "$(
            echo "x=("
            grep -oP '(\w+)(?==)|(?<==\[).*?(?=\])' <<< "$line" |
              tr -d , |
              paste - - |
              sed 's/^/[/; s/\t/]="/; s/$/"/'
            echo ")"
        )"

        for key in "${!x[@]}"; do           # need quotes here
            for element in ${x[$key]}; do   # no quotes here
                printf "%s\t%s\n" "$key" "$element"
            done
        done    
    done < primary.txt

উত্তর:


4

ব্যাশ ডেটা স্ট্রাকচারগুলি এমনকি 2-মাত্রিক অ্যারেগুলির জন্য খুব প্রাথমিক। আপনি কি নিশ্চিত যে এটি সেই সরঞ্জামটি আপনি ব্যবহার করতে চান?

বাশ এবং জিএনইউ গ্রেপ সহ, আপনি এই বিরক্তিকর জগাখিচুড়ি করতে পারেন:

line='{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}'
declare -A "$(
    echo "x=("
    grep -oP '(\w+)(?==)|(?<==\[).*?(?=\])' <<< "$line" |
      tr -d , |
      paste - - |
      sed 's/^/[/; s/\t/]="/; s/$/"/'
    echo ")"
)"

for key in "${!x[@]}"; do           # need quotes here
    for element in ${x[$key]}; do   # no quotes here
        printf "%s\t%s\n" "$key" "$element"
    done
done
machineA    0
machineA    1024
machineA    4
machineA    1028
machineB    1
machineB    1025
machineB    5
machineB    1029

এটি বেশ ভঙ্গুর। আমি পার্লকে এরকম কোনও কিছুর জন্য ব্যবহার করব: এখনও কুৎসিত তবে আরও সংক্ষিপ্ত

echo "$line" | perl -MData::Dumper -ne '
    s/=\[/=>[/g; 
    eval "\$x=$_";
    # do something with your data structure (a hash of arrays) 
    print Dumper($x)
'
$VAR1 = {
          'machineB' => [
                          1,
                          1025,
                          5,
                          1029
                        ],
          'machineA' => [
                          0,
                          1024,
                          4,
                          1028
                        ]
        };

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

+1 এর সাথে সুন্দর চটুল চলাফেরা করুন eval
জোসেফ আর।

1

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

একটি পদ্ধতি হ'ল সহজে প্রসেস করা যায় এমন ফর্ম্যাটটির ধরণের জন্য ফাইলটি প্রিপ্রসেস করা। আমি ধরে নিয়েছি যে বন্ধনী এবং ধনুর্বন্ধনী এখানে চিত্রিত ব্যতীত অন্য কোনওভাবে ব্যবহৃত হয় না (পুরো পাঠ্যের চারপাশে ব্রেসেস, মেশিন মান তালিকার চারপাশে বন্ধনী)।

<data.txt sed -e 's/^{//' -e 's/}$//' -e 's/ *= *\[/,/g' -e 's/, */,/g' -e 's/\] *$//' -e 's/] *, */\n/g'

ফলাফলটিতে পৃথক রেকর্ডে প্রতি মেশিন এবং কমা রয়েছে machine নিম্নলিখিত স্নিপেট প্রতিটি লাইনে মেশিনের নাম পার্স করে এবং কমা দ্বারা পৃথক করা মানগুলির তালিকা ছেড়ে দেয় values

 | while IFS=, read -r machine values; do 

নিম্নলিখিত বাশ-নির্দিষ্ট স্নিপেট মানগুলিকে একটি অ্যারে রাখে।

 | while IFS=, read -r -a values; do
  machine=${values[0]}; shift values
  echo "There are ${#values[@]} on machine $machine"
done

@ গাইলস: পরামর্শের জন্য ধন্যবাদ। প্রতিটি মেশিনের জন্য মোট ফাইলের সংখ্যা পাওয়াও কি সম্ভব? একই উপরের কমান্ড ব্যবহার করে মোট সংখ্যা গণনা? যেমন, উদাহরণস্বরূপ, মেশিনএর চারটি ফাইল রয়েছে এবং মেশিনবিতেও চারটি ফাইল রয়েছে
এসএসএইচ

@ এসএসএইচ আমার সম্পাদনা দেখুন।
গিলস'স'-দুষ্ট হওয়া বন্ধ করুন '

0

আপনি awkটাস্কটি সম্পূর্ণ করতে ব্যবহার করতে পারেন ।

awk -F "], " '/[a-zA-Z]=\[[0-9]/ {gsub(/{|}/,""); for(i=1; i<=NF; i++) if($i !~ /\]$/) print $i"]"; else print $i}' data.txt

machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]

ধন্যবাদ জন। প্রতিটি মেশিনের জন্য মোট ফাইলের সংখ্যা কী পাওয়া সম্ভব? যেমন, উদাহরণস্বরূপ, মেশিনএতে চারটি ফাইল রয়েছে এবং মেশিনবিতেও চারটি ফাইল রয়েছে। এটিও কি সম্ভব?
এসএসএইচ

0

এটি কিছুটা JSON এর মতো দেখাচ্ছে। আপনি এটি যথাযথ JSON হিসাবে ঠিক করতে এবং JSON সরঞ্জামগুলি ব্যবহার করতে পারেন:

$ echo '{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}' |  perl -pe 's!\b!"!g; s/=/:/g' | json_pp
{
   "machineB" : [
      "1",
      "1025",
      "5",
      "1029"
   ],
   "machineA" : [
      "0",
      "1024",
      "4",
      "1028"
   ]
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.