Вопрос или проблема
У меня есть файл .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: Подготовка файлов
Убедитесь, что у вас есть два файла:
-
Файл .fam — файл в формате PLINK, содержащий данные о семьях. Пример структуры:
1 I001.HO 0 0 1 1 2 I002.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
Шаг 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
или файловыми форматами, не стесняйтесь их задавать.