অ্যাজক ব্যবহার করে দুটি ফাইল প্রক্রিয়াজাত করা হচ্ছে


9

আমি ইউনিক্স এবং আওক ব্যবহার করে দুটি ফাইলের তুলনা করে পড়েছি । এটা সত্যিই আকর্ষণীয়। আমি এটি পড়েছি এবং পরীক্ষা করেছি, তবে আমি এটি পুরোপুরি বুঝতে পারি না এবং এটি অন্যান্য ক্ষেত্রেও ব্যবহার করতে পারি না।

আমার দুটি ফাইল আছে file1একটি ক্ষেত্র এবং অন্যটির 16 টি ক্ষেত্র রয়েছে। আমি file1 এর উপাদানগুলি পড়তে এবং তাদের 3 য় ক্ষেত্রের সাথে তুলনা করতে চাই file2। যদি প্রতিটি উপাদানের সাথে কোনও মিল থাকে তবে আমি ক্ষেত্রের 5 এর মান যোগ করব file2। উদাহরণ হিসাবে:

ফাইল 1

1
2
3

ফাইল 2

2 2 2 1 2
3 6 1 2 4 
4 1 1 2 3
6 3 3 3 4 

উপাদান 1 এর জন্য file1আমি ফিল্ড 5 এর file2মান যেখানে 1 এর ক্ষেত্রের মান যোগ করতে চাই এবং এবং উপাদান 2 এবং 3 এর জন্য একই কর file1। 1 এর আউটপুট (3 + 4 = 7) এবং 2 এর জন্য 2 এবং 3 এর জন্য 4 হয়।

আমি জানি না কীভাবে আমি এএসকে দিয়ে লিখি।

উত্তর:


20

এখানে একটি উপায়। আমি এডকে স্ক্রিপ্ট হিসাবে লিখেছি যাতে আমি মন্তব্য যুক্ত করতে পারি:

#!/usr/local/bin/awk -f

{
    ## FNR is the line number of the current file, NR is the number of 
    ## lines that have been processed. If you only give one file to
    ## awk, FNR will always equal NR. If you give more than one file,
    ## FNR will go back to 1 when the next file is reached but NR
    ## will continue incrementing. Therefore, NR == FNR only while
    ## the first file is being processed.
    if(NR == FNR){
      ## If this is the first file, save the values of $1
      ## in the array n.
      n[$1] = 0
    }
    ## If we have moved on to the 2nd file
    else{
      ## If the 3rd field of the second file exists in
      ## the first file.
      if($3 in n){
        ## Add the value of the 5th field to the corresponding value
        ## of the n array.
        n[$3]+=$5
      }
    }
}
## The END{} block is executed after all files have been processed.
## This is useful since you may have more than one line whose 3rd
## field was specified in the first file so you don't want to print
## as you process the files.
END{
    ## For each element in the n array
    for (i in n){
    ## print the element itself and then its value
    print i,":",n[i];
    }
}

আপনি এটি ফাইল হিসাবে সংরক্ষণ করতে পারেন, এটি কার্যকর করতে পারেন এবং এটির মতো চালান:

$ chmod a+x foo.awk
$ ./foo.awk file1 file2
1 : 7
2 : 2
3 : 4

অথবা, আপনি এটি একটি ওলাইনারে ঘন করতে পারেন:

awk '
     (NR == FNR){n[$1] = 0; next}
     {if($3 in n){n[$3]+=$5}}
     END{for (i in n){print i,":",n[i]} }' file1 file2

9
awk '
  NR == FNR {n[$3] += $5; next}
  {print $1 ": " n[$1]}' file2 file1

এটি ম্যাচবিহীন ক্ষেত্রগুলি যোগ করে কিছু অতিরিক্ত কাজ করে।
ইমানুয়েল

@ এমমানুয়েল, এটি এখনও ফাইল 2-এর লাইন অনুসারে একটি দুর্দান্ত নির্দেশনা, যা এটি টেরডনের চেয়ে কম এবং দ্রুততর করে তোলে
স্টাফেন

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