Sample.csv

DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45

мне нужно количество сбоев в вышеупомянутом sample.csv с ответом как

abc 5
def 2

но я не упомянул abc/def в сценарии. потому что я дал пример сценария в моем случае, многие из строк, таких как abc, есть, поэтому мне нужна эта строка и считать с ошибкой.

пожалуйста, предложите мне

заранее спасибо

3 ответа3

3

Простое решение - использовать следующую трубу:

<Sample.csv grep '^[^,]*,[^,]*,FAILURE' | cut -d, -f2 | sort | uniq -c
  • grep извлечет строки с FAILURE в третьем столбце
  • cut будет извлекать столбец (разделитель , столбец № 2)
  • sort отсортирует извлеченный столбец (одинаковые значения будут рядом друг с другом.)
  • uniq удалит повторяющиеся значения, опция -c покажет количество каждого уникального значения

Вы также можете вставить другие фильтры в трубу по мере необходимости. (например, grep в начале).

1

Комментарий Рики таков, как я это сделаю, но если вам нужно решение, специфичное для grep, вы можете сделать следующее:

$ for i in {abc,def}; do echo -n "$i: "; grep -c $i input.txt; done;

это выведет ожидаемое:

abc:5
def:2

Обновить

Если вы не хотите включать ключи поиска в цикл for, я не вижу, как это сделать просто с помощью grep.

Вы можете сделать это с помощью awk.

awk 'BEGIN{FS=","}//{a[$2]++}END{for(x in a) print x,a[x]}' test.txt

Объяснение:

FS = "," - установить разделитель записей на запятую

// - сопоставить все строки

Мы создаем ассоциированный массив под названием «а»

[$ 2]++ - каждый шаблон соответствует, мы берем 2-й столбец и увеличиваем количество

END {..} - этот блок запускается, когда сделано все совпадения. перебираем все элементы печатаем ключ и считаем.

-2

пожалуйста, найдите то же самое:

awk < Sample.txt -F',' '{print $2}' | sort |uniq -c| grep "FAILURE"

Спасибо за ваши ответы :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .