একটি awk মুদ্রণ কমান্ডে বাছাই কিভাবে করবেন?


8

আমি লিখছি এমন একটি awk স্ক্রিপ্টে আমার বেশ কয়েকটি কমান্ড রয়েছে:

print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2}

কোন ফলাফল:

Here are some players and their numbers, sorted by last name
Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55

আমি কীভাবে কেবল আমার প্লে স্ক্রিপ্টে প্লেয়ার এবং তাদের সংখ্যা বাছাই করতে sortকমান্ডটি ব্যবহার করতে পারি ?


3
উত্তর আপনার মন্তব্য দেওয়া, আপনি বিভ্রান্তিকর হবে বলে মনে হচ্ছে awk এবং শেল আপনার প্রশ্নে স্ক্রিপ্ট। মনে হচ্ছে আপনি বাছাই করতে চান আপনার awk স্ক্রিপ্ট মধ্যে , নেই শেল এটা invoking স্ক্রিপ্ট। যদি এটি সঠিক হয়, তবে দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন এবং 'শোক' এর দুটি উপস্থিতি 'অ্যাডক' দ্বারা প্রতিস্থাপন করুন। একটি পৃথক নোটে: হ্যাঁ, অ্যাডকে একটি বাছাই করার সুবিধা রয়েছে তবে এটি বেশ জড়িত: আপনার অবশ্যই সমস্ত রেখাগুলি একটি অ্যারেতে সংরক্ষণ করতে হবে, তাদের দ্বিতীয় ক্ষেত্রের উপর ভিত্তি করে তৈরি করা হবে, যা থেকে আপনাকে বের করতে হবে x, তারপরে PROCINFO["sorted_in"]একটি ক্রিপ্টিক মানতে সেট করা হবে, তারপরে অ্যারে আউটপুট করুন। আমি সেখানে যাব না।
zwets

1
আমি বলতে চাইছি: সরলতার কারণে আমি সেখানে যাব না ... | sort -k2,2
zwets

@Zwets ...| sort -k2,2অন্যান্য লাইন প্রিন্ট করা দরকার থাকলে আমি কীভাবে বাস্তবায়ন করব ? সম্পাদিত প্রশ্ন চেক করুন।
কেএম 142646

echoশেল থেকে শিরোলেখ লাইন দ্বারা , তারপর awk | sortপাইপলাইন চালান ।
zwets

উত্তর:


12

আপনি | sort -k2আপনার কমান্ড যোগ করতে পারেন । এটি দ্বিতীয় কলামের উপর ভিত্তি করে বর্ণমালা অনুসারে বাছাই করবে।

উদাহরণ:

$ echo "Lebron James 23
Kevin Durant 35
Kobe Bryant 24
Blake Griffin 32
Dikembe Mutumbo 55" | sort -k2

ফলাফল স্বরূপ

Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55

দুর্ভাগ্যক্রমে আমি একটি স্ক্রিপ্ট ব্যবহার করছি, এবং সাজ্ট কমান্ডটি অন্য অনেক আউটপুটগুলির সাথে ছড়িয়ে যাবে। {print x, $2}স্ক্রিপ্ট কোডে সরাসরি আউটপুট সাজানোর কোনও উপায় আছে কি ? পাইপ দেওয়ার সময় আমি একটি ত্রুটি পাচ্ছি if(sum[x] > 500) {print x, $2} | sort -k2
কেএম 142646

3
@ কেময়: শেল কমান্ড থাকার if(sum[x] > 500) {print x, $2}সময় | sort -k2এটি অ্যাওক কোড । স্পষ্টতই আপনি দুটির মতো মিশতে পারবেন না কারণ তারা ভিন্ন ভাষা। পরিবর্তে আপনাকে sortআপনার অ্যাওক কোড স্নিপেট চালায় এমন Awk ইন্টারপ্রেটারের আউটপুটে কমান্ডটি প্রয়োগ করতে হবে । আমার অর্থ কী তা আপনি যদি না জানেন তবে আমাদের সম্পূর্ণ ছবি দেওয়ার জন্য আপনার প্রশ্নটি প্রসারিত করুন।
ডেভিড ফোরস্টার

1
আপনি শেল স্ক্রিপ্ট লিখছেন, তাই না? তারপরে আপনার দুটি বিকল্প রয়েছে: ১. রান করুন ./my-script.sh | sort -k2। 2. যোগ করুন `| আপনার স্ক্রিপ্টের লাইনে সাজান -k2` যা আপনার প্রশ্নে প্রদত্ত আউটপুট উত্পাদন করে।
ওয়েন_ইউক্স

@ ওয়াইন_ইউक्स দয়া করে মূল প্রশ্নে সম্পাদিত সম্পাদনাগুলি পরীক্ষা করুন।
কেএম 142646

তারপরে আপনার সম্ভবত উত্তরটির দরকার
@

9

যদিও আমি এটির সুপারিশ করব না (বাহ্যিক sortকমান্ডের মাধ্যমে ফলাফলটি পাইপ করার ক্ষেত্রে আপেক্ষিক সরলতা দেওয়া হয়েছে ) আপনি অন্তত জিএনইউ অ্যাজকের সাম্প্রতিক সংস্করণ (কমপক্ষে 4.0 আইআইআরসি) দিয়ে এটি করতে পারেন, যেমন গাকের সাথে অ্যারে মানগুলি এবং সূচকগুলি বাছাইকরণে বর্ণিত হয়েছে

অনুগ্রহপূর্বক কোনও মিশুক অ্যারেতে আপনার কাছে ডেটা আছে তা ধরে নিয়ে আপনি কীভাবে এটি প্রয়োগ করতে পারেন তা এখানে Firstname Lastname। প্রথমে আপনাকে একটি কাস্টম তুলনা ফাংশন নির্ধারণ করতে হবে যা সূচককে বিভক্ত করে, Lastnameতারপরে প্রথমে তুলনা করে (টাই ব্রেকার হিসাবে) Firstnameযেমন

function mycmp(ia, va, ib, vb, sa, sb) {
  if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
    if(sa[2] < sb[2]) return -1;
    else if (sa[2] > sb[2]) return 1;
    else {
      # compare first names
      if(sa[1] < sb[1]) return -1;
      else if (sa[1] > sb[1]) return 1;
      else return 0;
    }
  }
  else return 0;
}

এখন আপনি PROCINFO["sorted_in"]@zwets দ্বারা মন্তব্যে উল্লিখিত অ্যারে বাছাই পদ্ধতিটি ব্যবহার করতে পারেন

PROCINFO["sorted_in"] = "mycmp";
for(i in a) print i, a[i];

একসাথে রেখে

#!/usr/bin/gawk -f

function mycmp(ia, va, ib, vb, sa, sb) {
  if(split(toupper(ia), sa) && split(toupper(ib), sb)) {
    if(sa[2] < sb[2]) return -1;
    else if (sa[2] > sb[2]) return 1;
    else {
      # compare first names
      if(sa[1] < sb[1]) return -1;
      else if (sa[1] > sb[1]) return 1;
      else return 0;
    }
  }
  else return 0;
}

{
  a[$1" "$2] = $3;
}

END {
  PROCINFO["sorted_in"] = "mycmp";
  for(i in a) print i, a[i];
}

পরীক্ষামূলক:

$ ./namesort.awk yourfile
Kobe Bryant 24
Kevin Durant 35
Blake Griffin 32
Lebron James 23
Dikembe Mutumbo 55

অজকের কম বা পুরানো সংস্করণগুলিতে, আপনার সেরা বাজি হতে পারে Lastname Firstnameপরিবর্তে সূচিযুক্ত ডেটা সংরক্ষণ করা, প্রচলিত অনুসারে বাছাই করা asorti, তারপরে সূচিগুলির ক্ষেত্রগুলি প্রিন্ট করার জন্য বিভক্ত হয়ে অদলবদল করা:

awk '
  {a[$2" "$1]=$3} 
  END {
    n=asorti(a,b); for (i=1;i<=n;i++) {split(b[i],s); print s[2], s[1], a[b[i]]}
}' yourfile

5

করতে sortকেবল সাদা ব্যবধান দ্বিতীয়টি ক্ষেত্র পৃথক করা, ব্যবহার কী -k2,2:

... | sort -k2,2

ডিফল্টরূপে sortডিক্সোগ্রাফিকভাবে বাছাই করে।

মনে রাখবেন, আপনি যদি বাছাই কীটির জন্য শেষ ক্ষেত্রটি উল্লেখ না করেন অর্থাত্ যদি আপনি কেবল ব্যবহার করেন -k2তবে আপনি পছন্দসই ফলাফল পেতে পারেন না কারণ এটি দ্বিতীয় থেকে শুরু হওয়া সমস্ত ক্ষেত্রsort অনুসারে হবে ।

এছাড়াও পরীক্ষা করে দেখুন man sort


আমার যা প্রয়োজন তার জন্য দয়া করে ওয়েনের পোস্টে মন্তব্যটি দেখুন
কেএম142646

1

চেষ্টা

awk -f myscript.awk | sort -k2

যেখানে myscript.awk এ বিশুদ্ধভাবে awk কমান্ড রয়েছে contains

যদি আপনার আসল স্ক্রিপ্টটি শেল স্ক্রিপ্ট হয় তবে আপনার কাছে কয়েকটি বিকল্প রয়েছে

  • সাজানোর মাধ্যমে পাইপ আউটপুট। ./myscript.bash | sort -k2

  • পরিবর্তে স্ক্রিপ্টের ভিতরে একটি ফাংশন হিসাবে কোডটিকে পুনরায় লেখুন

    $ cat t1
    #!/bin/bash
    for i in 2 4 3 1 5;
    do
      echo $i
    done
    
    $ ./t1
    2
    4
    3
    1
    5
    

    ডু

    $ cat t2
    #!/bin/bash
    function foo {
      for i in 2 4 3 1 5;
      do
        echo $i
      done
    }
    foo | sort
    
    $ ./t2
    1
    2
    3
    4
    5
    

তবে নোট করুন আপনি কোনও ফাংশন তৈরির পরিবর্তে do ... সম্পন্ন কাঠামোর ক্ষেত্রেও বাছাই করতে পারেন।

    do
       echo $i
    done | sort

কেন ফাংশন সংজ্ঞায়িত?
zwets

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

1

আপনার তথ্য মুদ্রণের জন্য সাজানোর জন্য:

  • মনে করুন আপনি 2 য় ক্ষেত্র মুদ্রণ করতে চান (সাদা স্থান পৃথক করে) এটি ব্যবহার করুন:

    awk '{print $2}' data.txt | sort
    

    উদাহরণ:

    $cat>data.txt
    1 Kedar 20
    2 Amit 30
    3 Rahul 21
    ^C
    
    $awk '{print $2}' | sort
    Amit
    Kedar
    Rahul
    
  • আপনি যদি পুরোটি মুদ্রণ করতে চান data.txtতবে 2 কলামে বাছাই করেছেন তবে:

    $awk '{print}'|sort -k2
    2 Amit 30
    1 Kedar 20
    3 Rahul 21
    

আপনার প্রয়োজনে এই যুক্তি (গুলি) ব্যবহার করুন।

আপনি man sortআরও আকর্ষণীয় বৈশিষ্ট্য জন্য ব্যবহার করতে পারেন sort


0

নীচে সম্পর্কে কি:

 awk 'BEGIN{str="1\n2\n3\n4"; system("echo -e \""str"\" | sort -r")}'

আমি যখন পরীক্ষা করি তখন এটি কাজ করে।


0
print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2 | "sort -k2,2"}

একটি ফাইলে আউটপুট সাজানোর জন্য:

print "Here are some players and their numbers, sorted by last name"
if(sum[x] > 500) {print x, $2 | "sort -k2,2 > sortedFile"}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.