отрежьте мой .fam файл, используя .txt файл с именами

Вопрос или проблема

У меня есть файл .fam в формате plink, он выглядит так

 1        I001.HO 0 0 1 1
 2        I002.HO 0 0 1 1
 3   IREJ-T006.HO 0 0 1 1
 4   IREJ-T009.HO 0 0 1 1
 5   IREJ-T022.HO 0 0 1 1
 6   IREJ-T023.HO 0 0 1 1
 7   IREJ-T026.HO 0 0 1 1
 8   IREJ-T027.HO 0 0 1 1
 9   IREJ-T037.HO 0 0 1 1
10   IREJ-T040.HO 0 0 1 1
11   IREJ-T053.HO 0 0 1 1
12   IREJ-T064.HO 0 0 1 1
13   IREJ-T078.HO 0 0 1 1
14   IREJ-T090.HO 0 0 1 1
15   IREJ-T101.HO 0 0 1 1
16   IREJ-T103.HO 0 0 1 1
17   IREJ-T111.HO 0 0 1 1
18   IREJ-T184.HO 0 0 1 1
19   IREJ-T204.HO 0 0 1 1
20     MAL-005.HO 0 0 1 1
21     MAL-009.HO 0 0 1 1

но с тысячами строк.
Но мне нужен только подмножество этих строк в моем конечном файле данных.
У меня есть файл .txt с каждым индивидом, которого я хочу сохранить.
Так это выглядит

IREJ-T184.HO
IREJ-T204.HO
MAL-005.HO
MAL-009.HO

Как я могу использовать этот файл .txt, чтобы создать новый файл только с строками, которые включают указанных индивидов, перечисленных в файле .txt? Я хочу сохранить все данные в строке, а не только имя ID.

Спасибо!

Используя awk:

$ awk 'NR==FNR{ a[$1]; next } $2 in a' file.txt file.fam
18   IREJ-T184.HO 0 0 1 1
19   IREJ-T204.HO 0 0 1 1
20     MAL-005.HO 0 0 1 1
21     MAL-009.HO 0 0 1 1

Чтобы узнать о awk, получите книгу Effective AWK Programming, 5-е издание, Арнольда Роббинса.

Ответ или решение

Чтобы выполнить подзадачу по отбору строк из файла .fam с использованием списка имен из текстового файла, можно воспользоваться утилитой awk, которая представляет собой мощный инструмент для обработки текстовых данных в Linux и Unix системах. Ниже представлено пошаговое руководство по выполнению данной операции.

Шаг 1: Подготовка файлов

Убедитесь, что у вас есть два файла:

  1. Файл .fam — файл в формате PLINK, содержащий данные о семьях. Пример структуры:

    1        I001.HO 0 0 1 1
    2        I002.HO 0 0 1 1
    ...
    21     MAL-009.HO 0 0 1 1
  2. Текстовый файл (.txt) — файл, содержащий имена индивидов, которых вы хотите оставить. Например:

    IREJ-T184.HO
    IREJ-T204.HO
    MAL-005.HO
    MAL-009.HO

Шаг 2: Использование команды awk

Откройте терминал и выполните следующую команду. Предположим, ваш файл .fam называется data.fam, а текстовый файл имен — names.txt:

awk 'NR==FNR{ a[$1]; next } $2 in a' names.txt data.fam > subset.fam

Разбор команды:

  • NR==FNR{ a[$1]; next }: Эта часть команды позволяет awk прочитать первый файл (names.txt) и сохранить каждое имя (первый столбец) в массив a.
  • $2 in a: Эта часть проверяет, содержится ли второй столбец (имя индивидов из файла .fam) в массиве a (т.е., в списке имен, которые вы хотите сохранить). Если имя найдено, вся строка из .fam файла будет выведена.
  • > subset.fam: Результат отбираемых строк будет записан в новый файл с именем subset.fam.

Проверка результатов

После выполнения команды вы получите файл subset.fam, который будет содержать только те строки, которые соответствуют именам из вашего текстового файла. Это может быть подтверждено с помощью команды cat или любого текстового редактора.

cat subset.fam

Заключение

Используя простую команду awk, вы можете эффективно отбирать необходимые строки из больших файлов в формате .fam, основываясь на списках имен. Этот метод является быстрым и безопасным, позволяет сохранять все данные в строках без изменений. Если у вас есть дополнительные вопросы о работе с awk или файловыми форматами, не стесняйтесь их задавать.

Оцените материал
Добавить комментарий

Капча загружается...