2015-07-23 6 views
0

Я обычно не работаю в bash, но grep может быть очень быстрым решением в этом случае. Я прочитал много вопросов о присвоении grep и переменной в bash, но я не вижу ошибки. Я попробовал несколько вариантов двойных кавычек вокруг $ pattern, использовал `...` `или $ (...), но ничего не получилось.bash grep variable as pattern

Так вот что я пытаюсь сделать: У меня есть два файла. Первый содержит несколько имен. Каждый из них я хочу использовать в качестве шаблона для grep, чтобы искать их в другом файле. Поэтому я просматриваю строки первого файла и присваиваю имя шаблону переменной. Этот шаг работает, когда переменная напечатана правильно. Но почему-то grep не распознает/не интерпретирует переменную. Когда я заменяю «$ pattern» на фактическое имя, все отлично. Поэтому я не думаю, что назначение переменной имеет проблему, но интерпретация «$ pattern» в качестве строки, которую она должна представлять.

Любая помощь очень ценится!

#!/bin/bash 

while IFS='' read -r line || [[ -n $line ]]; do 
    a=($line) 
    pattern="${a[2]}" 
    echo "Text read from file: $pattern" 
    var=$(grep "$pattern" 9606.protein.aliases.v10.txt) 
    echo "Matched Line in Alias is: $var" 
done < "$1" 


> bash match_Uniprot_StringDB.sh ~/Chromatin_Computation/.../KDM.protein.tb 

выход:

Text read from file: "UBE2B" 
Matched Line in Alias is: 
Text read from file: "UTY" 
Matched Line in Alias is: 

EDIT drvtiny решения, предложенные работы. Необходимо избавиться от двойных кавычек, чтобы соответствовать строке. Добавление следующих строк заставляет скрипт работать.

pattern="${pattern#\"}" 
pattern="${pattern%\"}" 
+0

Не видя образец и образец входных файлов ('' KDM.protein.tb' и 9606.protein.aliases.v10.txt') , трудно определить, где проблема. То, что я вижу в вашем вопросе, не выглядит особенно ошибочным *, поэтому проблема может заключаться в том, как вы интерпретируете регулярное выражение, которое находится в '$ pattern'. Вы знаете, что grep использует регулярное выражение, верно? – ghoti

+0

Кроме того, являются ли строки в 'KDM.protein.tb', возможно, только два поля длинными (то есть' $ pattern' является последним «словом» в строке), и файл был сгенерирован в Microsoft Windows? Если это звучит правдоподобно, тогда вы можете иметь дело с символами Ctrl-M в конце каждой строки, которые Windows считает частью «новой строки», но unix рассматривает часть последнего слова каждой строки. Вы не упомянули, какую платформу вы используете или откуда пришли файлы, поэтому нам не нужно знать, является ли это проблемой. – ghoti

+0

Строки в KDM.protein.tb - три поля длиной; это текстовый файл с разделителями табуляции, сгенерированный в ubuntu. Интересный момент. –

ответ

1

Пожалуйста, посмотрите вариант «-f ФАЙЛ» в man grep. Я рекомендую, чтобы этот вариант выполнял именно то, что вам нужно, без каких-либо петель bash или таких других «хаков» :)

И да, в соответствии с результатами вашего кода вы читаете образец, включая двойные кавычки буквально. Другими словами, вы читаете из файла ~/Chromatin_Computation /.../ KDM.protein.tb эту строку:

"UBE2B" 

, но не

UBE2B 
  • , как вы, вероятно, ожидать.

Возможно, вам нужно удалить двойные кавычки на границах вашего шаблона $?

Попробуйте сделать это после чтения шаблона:

pattern=${pattern#\"} 
pattern=${pattern%\"} 
+1

Именно в этом и была проблема.Спасибо за подсказку. Но добавление обратной косой черты после # и% дополнительно необходимо. –