2015-11-09 2 views
1

У меня возникли проблемы с получением регулярного выражения, которое будет искать член ввода в указанном столбце. Если этот термин найден в этом столбце, тогда ему нужно вывести эту целую строку. Это мои переменные:Регулярное выражение для поиска столбца в текстовом файле

sreg = search word #Example: Adam 
file = text file #Example: Contacts.txt 
sfield = column number #Example: 1 

текстовый файл в этом формате с пространством, являющимся поле Seperator, со многими контактных записей:

First Last Email Phone Category  
    Adam aster [email protected] 8473847548 word 
    Jeff Williams [email protected] 940342221995 friend 
    JOhn smart [email protected] 999999393 enemy 
    yooun yeall adada 111223123 other 
    zefir sentr [email protected] 8847394578 other 

Я пытался без успеха:

grep "$sreg" "$file" | cut -d " " -f"$sfield"-"$sfield" 
awk -F, '{ if ($sreg == $sfield) print $0 }' "$file" 
awk -v s="$sreg" -v c="$sfield" '$c == s { print $0 }' "$file" 

Спасибо за любую помощь!

+0

Спасибо, добавил больше информации. Пространство - это разделитель полей. – Joe

+0

$ sfield => 1, 2, .. нужно другое выражение, чтобы изменить его на $ 1, $ 2 ... –

+0

Ваш экспресс awk -vs = "$ sreg" -vc = "$ sfield" '$ c == s {print $ 0} '"$ file" выглядит правильно ... –

ответ

4

awk может быть лучшим решением для этого:

awk -v field="$field" -v name="$name" '$field==name' "$file" 

Это проверяет, является ли поле номер $field имеет значение $name. Если это так, awk автоматически распечатывает полную строку, содержащую его.

Например:

$ field=1 
$ name="Adam" 
$ file="your_file" 
$ awk -v field="$field" -v name="$name" '$field==name' "$file" 
Adam aster [email protected] 8473847548 word 

Как вы можете видеть, мы даем параметры, используя -v var="$bash_var", так что вы можете использовать их в awk.

Кроме того, пространство является разделителем полей, поэтому вам не нужно указывать его, так как он по умолчанию.

+1

Спасибо! Это помогло много. – Joe

1

Это работает для меня:

awk -v f="$sfield" -v reg="$sreg" '{if ($f ~ reg) {print $0}}' "$file" 

Основная проблема заключается в том, что вам нужно косвенность от $ sfield (исключая, "1") до $ ($ sfield) (например, $ 1).

Я пробовал использовать backtricks`, а также используя $ {! Sfield}, но они не работают в awk, так как awk этого не принимает. Наконец, я нашел способ передачи переменной в awk, преобразование в awk internal variabls (с использованием -v).

Внутри awk я обнаружил, что вы даже не можете использовать переменные снаружи. Таким образом, я должен был также сдать sreg.

Обновление: Я думаю, что использование «~» вместо «==» лучше, потому что исходное требование говорит matchi == ng регулярное выражение.

Например, Sreg = Ad

+0

Обратите внимание, что '{if (condition) {print $ 0}}' можно переписать в простое условие. Зачем? Поскольку 'awk' оценивает каждое выражение таким образом, что если оно равно True, выводится текущая запись (строка). – fedorqui

+0

Спасибо за ваш комментарий, это помогает. –

+0

сравнение ==, действительно ли равное сравнение? Как насчет того, хотим ли мы соответствовать регулярному выражению, используя ~ лучше? –

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