Bash: создать отчет с выводом grep? - PullRequest
0 голосов
/ 30 декабря 2010

Привет.

Мне нужно создать простой отчет через Bash (Korn?) С этими необработанными данными

Test_Version=V2.5.2
Test_Version=V2.6.3
Test_Version=V2.4.7
Test_Version=V2.5.2
Test_Version=V2.5.2
Test_Version=V2.5.1
Test_Version=V2.5.0
Test_Version=V2.3.9
Test_Version=V2.3.1

В идеале я хотел бы получить что-то вроде этого отсортированного вывода

Version    Count
...
V2.5.0     1
V2.5.1     1
V2.5.2     3
V2.6.3     1
...

Я могу отсортировать вывод следующим образом (необработанные данные содержатся в файлах ASCII):

find . -name "*.VER" -exec grep "Test_Version" '{}' ';' -print | grep -e "Test_Version" | sort -u

Но я не могу понять, как считать свои записи в табличном формате. Есть идеи, как мне это сделать?

Спасибо !!

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Как насчет чего-то вроде:

$ cat input.txt | sed 's/.*=//' | sort | uniq -c
      1 V2.3.1
      1 V2.3.9
      1 V2.4.7
      1 V2.5.0
      1 V2.5.1
      3 V2.5.2
      1 V2.6.3

Можно настроить его в точном формате оттуда ...

1 голос
/ 30 декабря 2010

Это похоже на работу для awk :

Предполагается, что информация о вашей версии находится в файле versions.txt (вы также не можете указать имя файла, в этом случае awk читает из стандартного ввода).

awk -F= '
        {counts[$2]=counts[$2]+1}
END     {for (key in counts)
            printf "%s\t%d\n", key, counts[key]}
' versions.txt

Пояснение:

  • -F= говорит awk использовать символ = в качестве разделителя полей. Каждая строка в ваших данных будет рассматриваться как два поля, из которых используется только второе.
  • Первый оператор между фигурными скобками выполняется для каждой строки ввода. Ведение подсчета для каждого вхождения второго поля, которое является $2.
  • Второй оператор в скобках, которому предшествует ключевое слово END, выполняется после обработки последней строки. Он показывает все значения для всех различных значений $2.
0 голосов
/ 30 декабря 2010

Вам не нужны никакие greps:

find . -name "*.VER" | 
  awk -F= '
    BEGIN {
      OFS="\t"
    }
    /Test_Version/{
      if (!count[$2]++) ver[num++]=$2
    } 
    END {
      print "Version", "Count"
      n=asort(ver); 
      for (i=1;i<=n;i++) print ver[i], count[ver[i]]
    }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...