2017-01-04 3 views
0

Мне действительно нужно grep всей строки. У меня есть файл с кучей строк, которые выглядят как этотКак grep шаблон, за которым следует число, только если число превышает определенное значение

1 123213 A T . stuff=1.232;otherstuf=34;morestuff=121;AF=0.44;laststuff=AV 
4 223152 D L . stuff=1.122;otherstuf=4;morestuff=41;AF=0.02;laststuff=RV 

, и я хочу, чтобы все строки, где AF> 0,1. Поэтому для строк выше я хочу только сохранить первую строку.

+0

Знаете ли вы, что 'AF' всегда имеет форму' 0.NN'? Если нет, вы должны разобрать поля и сравнить значение как число, а не пытаться использовать регулярные выражения. – dimo414

+0

Нет, это не последовательное количество цифр. Может быть AF = 1 или AF = 0,00054435. Я надеялся избежать его раскалывания, но хорошо. Спасибо за помощь!! –

+0

Нет ничего плохого в извлечении поля (и оно даже не обязательно будет менее эффективным), и гораздо правильнее делать арифметику, чем сопоставление строк. – dimo414

ответ

1

Вы можете использовать awk с несколькими разделителями для извлечения значения и сравнить его:

$ awk -F';|=' '$8 > 0.1' file

1

Предполагая, что AF всегда в форме 0.NN вы можете просто совпадают со значениями, где десятки место 1-9, например:

grep ';AF=0.[1-9][0-9];' your_file.csv 

Вы можете добавить + после второй группы символов для поддержки дополнительных цифр (т.е. 0.NNNNN), но если значения могут быть вне диапазона [0, 1), вы не должны пытаться сопоставить это поле с регулярными выражениями.

2

Использование гну-AWK вы можете сделать это:

awk 'gensub(/.*;AF=([^;]+).*/, "\\1", "1", $NF)+0 > 0.1' file 

1 123213 A T . stuff=1.232;otherstuf=34;morestuff=121;AF=0.44;laststuff=AV 

Эта gensub функция разбирает из AF=<number> из последнего поля ввода и фиксирует число в захваченной группы № 1, который используется для сравнения с 0.1.

PS: +0 преобразует разобранное поле в число.

+1

Это должно быть принято, фактически +1 –

+0

@AkshayHegde с использованием функции подстановки, то есть 'gensub' означает, что это медленнее, чем другие решения. – Zlemini

+1

Медленнее/быстрее не проблема. В соответствии с требованием OP должно соответствовать условию 'AF> 0,1', которое может быть или не быть в заданной позиции. – anubhava

0

Я бы использовал awk. Поскольку awk поддерживает буквенно-цифровые сравнения вы можете просто использовать это:

awk -F';' '$(NF-1) > "AF=0.1"' file.txt 

-F';' разбивает строку на поля по ;. $(NF-1) адресует второе последнее поле в строке. (NF этого число полей)

+1

Это было просто и сработало для меня. Благодаря! –

+0

Добро пожаловать. – hek2mgl

+0

Это не обнаружит запись, если строка ввода '1 123213 A T. stuff = 1.232; otherstuf = 34; morestuff = 121; AF = .44; laststuff = AV' – anubhava

1
$ awk -F= '$5>0.1' file 
1 123213 A T . stuff=1.232;otherstuf=34;morestuff=121;AF=0.44;laststuff=AV 

Если это не делать то, что вы хотите при запуске вместо ваших реальных данных, затем отредактируйте свой вопрос, чтобы предоставить более по-настоящему представительный образец ввода/вывода.

Смежные вопросы