Использование Grep для поиска в списке и возврата совпадений

Благодаря Томасу Дики я нашел решение. Установка переменной TERM на «linux» вместо «vt100».

Эта ссылка помогла узнать больше об этой переменной и о том, что она делает :http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-11.html

2
12.05.2020, 20:03
1 ответ

Первое изменение — не делать этого в цикле оболочки! Это означает, что вы ищете файл один раз для каждого имени гена, и это займет гораздо больше времени, чем необходимо. Вместо этого используйте опцию -fдля grep, чтобы дать ему список имен в качестве входных данных :

.
grep -iFxf ShortList.txt  FullList.txt > Final_List_With_Numbers

Используемые опции::

  -i, --ignore-case
          Ignore  case  distinctions in patterns and input data, 
          so that characters that differ only in case match each other.

   -F, --fixed-strings
          Interpret PATTERNS as fixed strings, not regular expressions.
   -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is 
          used multiple times or is combined with the -e (--regexp) option,
          search for all patterns given.  The empty file contains zero patterns, 
          and therefore matches nothing.
   -x, --line-regexp
          Select  only  those matches that exactly match the whole line.  
          For a regular expression pattern, this is like parenthesizing
          the pattern and then surrounding it with ^ and $.

-xособенно важен, так как вы не хотите находить LOC12345при поиске LOC1. Однако, если ваш FullList.txtне имеет только название гена в каждой строке, то вы, вероятно, захотите использовать -wвместо-x:

   -w, --word-regexp
          Select only those lines containing matches that form whole  words.   The  test  is  that  the
          matching  substring  must  either  be at the beginning of the line, or preceded by a non-word
          constituent character.  Similarly, it must be either at the end of the line or followed by  a
          non-word  constituent  character.   Word-constituent  characters are letters, digits, and the
          underscore.  This option has no effect if -x is also specified.

Показанный код должен работать. Это было бы очень, очень медленно и неэффективно и, вероятно, вернуло бы неправильные результаты, если одно из имен в Shortlist может быть подстрокой одного из имен в FullList. Если вы так и не получили никаких результатов, я предполагаю, что ваш ShortList.txtбыл создан в Windows и имеет окончание строки в стиле Windows -(\r\n). Это означает, что каждый iв вашем цикле for i in ${LIST}не будет geneName, а вместо этого будет geneName\r, который не существует в FullList.txt, поэтому результаты не будут найдены.

Если вы тестируете *nix-файл, он будет работать должным образом:

$ cat ShortList.txt 
name1
name2
name3

$ cat FullList.txt 
name3
name4

Теперь запустите свой точный код на этих примерах:

$ LIST=$(cat ShortList.txt); for i in ${LIST}; do 
   RESULT=$(grep -i ${i} FullList.txt);     
   echo "${RESULT}" >> Final_List_With_Numbers;
 done
$ cat Final_List_With_Numbers 



name3

Конечно, он также содержит пустые строки, поскольку, когда вы не найдете совпадения, $RESULTпусто, но вы все еще echoвводите его, что означает, что будет напечатана только пустая строка. Еще одна причина, по которой использование здесь цикла оболочки — плохая идея.

3
28.04.2021, 23:14

Теги

Похожие вопросы