grep несколько строк с уникальным количеством и строкой

0

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, есть, поэтому мне нужна эта строка и считать с ошибкой.

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

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

manu2711
источник
Этот образец CSV-выдержки имеет разное количество полей в каждой строке; Вы уверены, что так отформатирован файл?
DopeGhoti
отсутствие правильной разметки
Ricky Beam

Ответы:

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, мне нужна динамическая строка с количеством.
manu2711
Вы должны добавить в FAILUREкачестве условия для подсчета, например: $3 == "FAILURE" { a[$2]++ } ....
Тор
-2

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

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

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

manu2711
источник
1
Это должно ответить на ваш собственный вопрос? Если это так, было бы неплохо, если бы вы могли добавить краткое объяснение.
Der Hochstapler
Это не будет работать, так как строка FAILUREне появляется во втором столбце в вашем примере. ( grepможет быть в начале трубы) Вы также должны добавить некоторые пояснения.
pabouk