ব্যাশে প্রথম ক্ষেত্রের আদেশ অনুসারে সারিগুলি কীভাবে গণনা করা যায়


9

এখানে ইনপুট থেকে একটি স্নিপেট আছে:

...
####################
Bala Bela;XXXXXX12345;XXXXXX12345678;A
SERVER345Z3.DOMAIN.com0
SERVER346Z3.DOMAIN.com0
SERVER347Z3.DOMAIN.com0
SERVER348Z3.DOMAIN.com0
ssh-dss ...pubkeyhere...
####################
Ize Jova;XXXXXX12345;XXXXXX12345;A
SERVER342Z3.DOMAIN.com0
SERVER343Z3.DOMAIN.com0
SERVER345Z3.DOMAIN.com0
ssh-rsa ...pubkeyhere...
...

এবং এখানে আমার দরকার OUTPUT এর একটি স্নিপেট রয়েছে:

Bala Bela;XXXXXX12345;XXXXXX12345678;A
4
Ize Jova;XXXXXX12345;XXXXXX12345;A
3

সুতরাং INPUT থেকে আমার একটি OUTPUT দরকার, যাতে আমি দেখতে পেলাম যে "SERVER" দিয়ে শুরু হওয়া কতগুলি সারি প্রদত্ত ব্যবহারকারীর কাছে যায় (যেমন: "বালা বেলা; XXXXXX12345; XXXXXX12345678; এ")। আমি কীভাবে এটি ব্যাশ করতে পারি?


আপনার কি এটিকে স্ট্যান্ডলোন বাশ হওয়া দরকার, না অন্য সরঞ্জাম গ্রহণযোগ্য (গ্রেপ, অ্যাজক, পার্ল ...)?
— ire_and_curses

আমি ধরে নেব (এবং এটি করে দিয়েছি) যে, অন্যথায় স্পষ্টভাবে বলা না হলে, ব্যাশ স্ক্রিপ্টিং প্রশ্নটি স্ট্যান্ডার্ড সরঞ্জামগুলির মতো গ্রেপ, অ্যাজক, সেড, পার্ল এবং সমস্ত কিছুর অনুমতি দেয়।
— ক্যাস

উত্তর:


6
{
i=0
while IFS= read -r line; do
  case "$line" in
    ssh*|'##'*)
      ;;
    SERVER*)
      ((++i))
      ;;
    *)
      if ((i>0)); then echo $i;i=0; fi
      echo "$line"
      ;;
  esac
done
if ((i>0)); then echo $i;i=0; fi
} <inputfile >outputfile

পার্ল ওয়ান-লাইনারে একই

perl -nle '
  BEGIN{$i=0}
  next if/^(ssh|##)/;
  if(/^SERVER/){++$i;next}
  print$i if$i>0;
  $i=0;
  print;
  END{print$i if$i>0}' inputfile >outputfile

এবং গল্ফড

perl -nle's/^(ssh|##|(SERVER))/$2&&$i++/e&&next;$i&&print$i;$i=!print}{$i&&print$i' inputfile >outputfile

কি দারুন. পার্ল আশ্চর্যজনক: ডি
— গ্যাসকো পিটার

5

এই সংস্করণটি এমন সমস্ত সারি গণনা করে যা grepলাইনে থাকা রেজিপক্সের সাথে মেলে না ।

#! /usr/bin/perl 

# set the Input Record Separator (man perlvar for details)
$/ = '####################';

while(<>) {
    # split the rows into an array
    my @rows = split "\n";

    # get rid of the elements we're not interested in
    @rows = grep {!/^#######|^ssh-|^$/} @rows;

    # first row of array is the title, and "scalar @rows"
    # is the number of entries, so subtract 1.
    if (scalar(@rows) gt 1) {
      print "$rows[0]\n", scalar @rows -1, "\n"
    }
}

আউটপুট:

বালা বেলা; XXXXXX12345; XXXXXX12345678; এ
4
আইজে জোভা; XXXXXX12345; XXXXXX12345; এ
3

আপনি যদি কেবল 'সার্ভার' দিয়ে শুরু করা লাইনগুলি গণনা করতে চান তবে:

#! /usr/bin/perl 

# set the Input Record Separator (man perlvar for details)
$/ = '####################';

while(<>) {
    # split the rows into an array
    my @rows = split "\n";

    # $rows[0] will be same as $/ or '', so get title from $rows[1]
    my $title = $rows[1];

    my $count = grep { /^SERVER/} @rows;

    if ($count gt 0) {
      print "$title\n$count\n"
    }
}

5
sed -n ':a /^SERVER/{g;p;ba}; h' file | uniq -c | 
  sed -r 's/^ +([0-9]) (.*)/\2\n\1/'

আউটপুট:

Bala Bela;XXXXXX12345;XXXXXX12345678;A
4
Ize Jova;XXXXXX12345;XXXXXX12345;A
3

যদি একটি উপসর্গ গণনা ঠিক থাকে:

sed -n ':a /^SERVER/{g;p;ba}; h' file |uniq -c

আউটপুট:

  4 Bala Bela;XXXXXX12345;XXXXXX12345678;A
  3 Ize Jova;XXXXXX12345;XXXXXX12345;A

4

একটি awkবিকল্প:

/^#{15,}/ {           # if line starts with 15 or more number signs
  if(k) {             # if any key found
    print k RS n      # print it and occurrences of SERVER
    n=0
  }
  getline             # key is on the next line
  k = $0
  next                # move to next record
} 

/SERVER/ { n++ }      # count occurrences of SERVER
END { print k RS n }  # print last record

সমস্ত এক লাইনে:

awk '/^#{15,}/ { if(n>0) { print k RS n; n=0 }; getline; k = $0; next } /SERVER/ { n++ } END { print k RS n }'

2

সুতরাং যদি আউটপুটটি প্রতিটি "বালতি" তে ইতিমধ্যে সাজানো হয় তবে আপনি কেবল প্রথম এন অক্ষর পরীক্ষা করে সরাসরি ইউনিক প্রয়োগ করতে পারেন:

cat x | uniq -c -w6

এখানে N == 6 হিসাবে SERVER লাইনের শুরু থেকে 6 টি অক্ষর নিয়ে গঠিত। আপনি এই আউটপুটটি শেষ করবেন (যা আপনার প্রয়োজনীয় আউটপুট থেকে কিছুটা আলাদা):

  1 ####################
  1 Bala Bela;XXXXXX12345;XXXXXX12345678;A
  4 SERVER345Z3.DOMAIN.com0
  1 ssh-dss ...pubkeyhere...
  1 ####################
  1 Ize Jova;XXXXXX12345;XXXXXX12345;A
  3 SERVER342Z3.DOMAIN.com0
  1 ssh-rsa ...pubkeyhere...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.