Благодаря Томасу Дики я нашел решение. Установка переменной TERM на «linux» вместо «vt100».
Эта ссылка помогла узнать больше об этой переменной и о том, что она делает :http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-11.html
Первое изменение — не делать этого в цикле оболочки! Это означает, что вы ищете файл один раз для каждого имени гена, и это займет гораздо больше времени, чем необходимо. Вместо этого используйте опцию -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
вводите его, что означает, что будет напечатана только пустая строка. Еще одна причина, по которой использование здесь цикла оболочки — плохая идея.