Базовая справка grep / awk - извлечение всех строк, содержащих список терминов, из одного файла в отдельный файл

nnoremap <F3> "=strftime("%Y-%m-%d").' - '.$LOGNAME<CR>P
inoremap <F3> <C-R>=strftime("%Y-%m-%d").' - '.$LOGNAME<CR>
6
22.05.2018, 16:06
3 ответа

Чтобы извлечь строки из data.txt с генами, перечисленными в genelist.txt :

grep -w -F -f genelist.txt data.txt > newdata.txt

grep :

  • -w указывает grep соответствовать только целым словам (т. е. ABC123 также не будет соответствовать ABC1234 ).
  • -F искать фиксированные строки (простой текст), а не регулярные выражения
  • -f genelist.txt читать шаблоны поиска из файла

Если вам нужен заголовок (Пример 1, Пример 2 и т. Д.):

grep -w -F -f genelist.txt -e Sample data.txt > newdata.txt
  • -e Sample также ищите "Sample"

Чтобы найти строки в genelist.txt , которых нет в newdata.txt :

grep -v -w -F -f <(sed -E -e 's/(\t|  +).*//' newdata.txt) genelist.txt
  • -v инвертировать поиск, печатать несовпадающие строки.

Остальные параметры grep такие же, но вместо использования файла с параметром -f используется так называемая подстановка процесса (см. также ), что позволяет использовать команду вместо фактического файла. Какой бы вывод ни создавала команда, рассматривается как содержимое «файла».

В этом случае мы используем команду sed -E -e 's / (\ t | +). * //' newdata.txt , которая выводит каждую строку newdata.txt после первого удаления всего либо из первого символа TAB, либо из первой пары пробелов, которые он видит. Другими словами, первое поле (например, «Ген А»). Мне пришлось использовать TAB или двойной пробел, потому что а) я не был уверен, были ли ваши данные разделены пробелами или TAB, и б) первые поля в вашем примере содержали пробелы.

Использованные параметры sed :

  • -E использовать расширенные регулярные выражения, поэтому мы можем использовать простые (, ) и + , которые более читабельны, чем необходимость экранировать их с помощью \ как \ (, \) , \ + .
  • -e 's / (\ t | +).* // ' указывает сценарий sed для применения к входу (newdata.txt)

Выполнение этой команды в вашем примере data.txt приведет к следующему результату:

$ sed -E -e 's/(\t|  +).*//' data.txt

Gene A
Gene B
Gene C
Gene D

В любом случае, вывод этой команды sed используется как список шаблонов поиска командой grep .

11
27.01.2020, 20:21

Чтобы ответить на ваш вопрос:

fgrep -w -f genelist.txt data.txt >results.txt
  • fgrep ищет фиксированные строки, а не регулярные выражения (как grep и egrep )
  • -w сообщает fgrep соответствие целым словам, поэтому ABC123 не будет соответствовать ABC1234
  • -f genelist.txt сообщает fgrep для чтения шаблонов поиска из genelist.txt .

Узнать, какие гены из genelist.txt не были включены в извлечение, немного сложнее. Один из способов сделать это:

awk '{ print $1 }' results.txt | fgrep -w -v -f - genelist.txt >outsiders.txt
  • awk '{print $ 1}' печатает первый столбец в текстовом файле; это список сопоставленных генов
  • fgrep снова соответствует фиксированным строкам
  • -w указывает fgrep сопоставить целые слова
  • -v указывает ему печатать строки, которые не соответствуют
  • -f - , указывают ему прочитать список шаблонов из stdin , то есть список совпадающих генов из awk .

Вы также можете сделать вещи немного более эффективными, удалив дубликаты из списка совпадающих генов перед поиском, вставив sort -u между awk и fgrep ]:

awk '{ print $1 }' results.txt | sort -u | fgrep -w -v -f - genelist.txt >outsiders.txt
4
27.01.2020, 20:21

Это довольно сложная задача без какого-либо предыдущего опыта работы с Linux. Однако я думаю, что понимаю, что вам нужно, и это не должно быть слишком сложно. Заранее благодарю, это очень краткий краткий курс в дополнение к очень базовому объяснению, но я буду рад рассказать подробнее, если это не имеет смысла, или отредактировать по необходимости.

Если вы просто хотите разобрать data.txt и переместить его в genelist.txt, вы можете просто использовать cat data.txt >> genelist.txt newfile.txt. (newfile.txt - это другой файл, в который, как вы упомянули, он собирается - имя произвольное).

Если вы хотите вывести строки для определенного имени, вы можете использовать cat data.txt | grep ABCD123 >> genelist.txt newfile.txt и изменить ABCD123 на то, что вы хотите.

Эта команда выведет ТОЛЬКО строки, найденные с помощью grep (что-то вроде функции "поиск", но поиск ведется только по строкам)

Символ "|" называется конвейеризацией, и в сочетании с командой grep действует как фильтр для того, что вы ищете. (cat zoofile.txt | grep pandas, например, будет искать все строки, включающие слово "pandas", в файле с именем "zoofile". Обратите внимание, что Linux чувствителен к регистру и найдет только то, что вы ввели. Если вам нужны ВСЕ экземпляры слов "panda, pandas, panderoons или pandering, вы можете использовать pand*, где * - подстановочный знак и может быть любым символом длиной от 0 до 255 бит. Это позволит подобрать от pand до pandzzzzzzzzzz и все, что между ними, включая числа).

Вы можете использовать awk для более сложного разбора столбцов (это один из моих любимых инструментов!), но, похоже, он не подходит для данного случая, если вам не нужны данные ТОЛЬКО из одного из столбцов на основе определенных параметров.

Наконец, здесь можно немного узнать о командной строке. Это может помочь с grep, но не касается awk.

https://www.codecademy.com/learn/learn-the-command-line

После этого здесь более подробно рассматривается awk. Существует множество ОЧЕНЬ подробных курсов по awk, но в них легко заблудиться. Это практический сайт, который демонстрирует больше того, что вы хотите сделать.

https://www.ibm.com/developerworks/library/l-awk1/

EDIT - после повторного прочтения я, возможно, что-то упустил - вы хотите сравнить два файла и вывести только то, что совпадает в одном и другом? Пожалуйста, посоветуйте и приведите пример, и я буду рад отредактировать свой ответ соответствующим образом.

3
27.01.2020, 20:21

Теги

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