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


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.