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

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

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


Этот образец 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"

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


1
Это должно ответить на ваш собственный вопрос? Если это так, было бы неплохо, если бы вы могли добавить краткое объяснение.
— Der Hochstapler

Это не будет работать, так как строка FAILUREне появляется во втором столбце в вашем примере. ( grepможет быть в начале трубы) Вы также должны добавить некоторые пояснения.
— pabouk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.