2015-03-26 2 views
2

Как я могу объединить несколько фильтров usign sed?Как найти шаблон с помощью sed?

вот мои данные установить

sex,city,age 
male,london,32 
male,manchester,32 
male,oxford,64 
female,oxford,23 
female,london,33 
male,oxford,45

Я хочу idetify все строки, которые содержат MALE И OXFORD. Вот мой подход:

sed -n '/male/,/oxford/p' file 

Благодаря

ответ

3

Вы можете связать блок с первой проверкой и поместить туда вторую. Например:

sed -n '/male/ { /oxford/ p; }' file 

Или инвертировать проверку и действие:

sed '/male/!d; /oxford/!d' file 

Однако, поскольку (как @Jotne указует) строка, содержащая female также содержит male и вы, вероятно, не хотите, чтобы соответствовать их, образцы должны, по крайней мере, быть изменен, чтобы содержать границы слов:

sed -n '/\<male\>/ { /\<oxford\>/ p; }' file 
sed '/\<male\>/!d; /\<oxford\>/!d' file 

Но так как это выглядит, как данные, разделенные запятыми и чек, вероятно, п ВЗ хотел проверить, является ли кто-то пошел в male университет, вероятно, было бы лучше использовать более строгую проверку с AWK:

awk -F, '$1 == "male" && $2 == "oxford"' file 

Это проверяет не только если строка содержит male и oxford, но и, если они находятся в соответствующем поля. То же самое можно сделать, несколько менее красиво, с помощью sed

sed '/^male,oxford,/!d' file 
+0

Это касается и «женского». – Jotne

+0

OP не говорит, что поле 1 и поле 2 содержит слово, точно так же, как получить строки с 'MALE AND OXFORD', но для его набора данных это должно быть нормально. – Jotne

+0

Я представляю вещи о структуре данных, это правда, но если мой вывод верен, тестирование для полей - это более здравый тест на мой взгляд. – Wintermute

1

Вы можете использовать awk

awk -F, '/\<male\>/ && /\<oxford\>/' file 
male,oxford,64 
male,oxford,45 

Он использует слово якорь, чтобы предотвратить попадание на самку.

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