2015-06-24 4 views
1

У меня есть большой файл в терминах строки, содержащей пары значений ключа. Я ищу подходящий способ поиска пары значений, где значение «яблоко» (может быть как верхним, так и нижним) и выводить только связанную пару ключей, если она найдена.Искать пару ключевых значений из строки и выводить только соответствующую запись

Для примера. 55 = APPLE

<SOH> является разделителем здесь.

8=FIX.4.2<SOH>9=153<SOH>35=D<SOH>49=BLP<SOH>56=SCHB<SOH>34=1<SOH>50=30737<SOH>97=Y<SOH>52=20000809-20:20:50<SOH>11=90001008<SOH>1=10030003<SOH>21=2<SOH>55=APPLE<SOH>54=1<SOH>38=4000<SOH>40=2<SOH>59=0<SOH>44=30<SOH>47=I<SOH>60=20000809-18:20:32<SOH>10=061<SOH> 

Рад, если бы вы могли предложить какие-либо предложения.

+0

Спасибо всем за помощь! – Skyline

ответ

1

Вы можете использовать класс символов для цифр с последующими =, и ключевым словом в схеме:

grep -io "[0-9]*=apple" file 
  • -i, --ignore случай
  • -o, --only синхронизм
  • [0-9] один символ в диапазоне от 0 до 9
  • Квантификатор: * Между нолем и неограниченным временем,
  • =apple соответствует символам = яблоко буквально (чувствительно к регистру)
+1

спасибо - это было наиболее подходящим для моего дела. – Skyline

1

Попробуйте это GNU Grep:

grep -ioP '>\K[^=]+=apple(?=<)' file 

Выход:

 
55=APPLE 
1

Wihtout больше информации о реальной хотел информация:

Возвращает кол-линии (так 0, если нет присутствия)

grep -i -E -c -e '(^|<SOH>)[^=]*=APPLE<SOH>' 

Предполагая:

  • <SOH> является конечным ограничителем
  • вы хотите только APPLE не слово/шаблона, который содержит яблоко
1

Использования one of these proper solutions для преобразования строки в массив, так что вы можете itterate через Все детали. Выполняя это, проверьте значение элемента с помощью сравнения строк if.

if [ "$value" = "APPLE" ]; then 
    # do stuff 
fi 
1

С awk:

awk -v RS="<SOH>" 'toupper($0)~/APPLE/' File 

Set <SOH> в качестве записи разделителя. Затем проверьте, соответствует ли любая запись совпадению с APPLE (чтобы сделать регистр нечувствительным к регистру, преобразованная запись сначала в верхний регистр), если сопоставлено, распечатайте запись.