извлечение определенных столбцов из текстового файла на основе списка из другого файла с использованием терминала - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы попросить о помощи.К сожалению, у меня нет никаких навыков программирования, но мне нужно сделать анализ биоинформатики.Для моего вопроса ниже я уже искал решения через Google, но решения, которые я нашел (даже здесь, в stackoverflow), не решили мою проблему и не могли понять, почему.Поэтому я был бы очень признателен за любую помощь.

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

У меня огромный текстовый файл (data.txt) (2,8 ГБ), который содержит 52000 строк и около 11000 столбцов.Первая строка - это заголовок.

Это выглядит так:

**data.txt**    
name    GTEX-144GN-2326-SM-5B26N    GTEX-145MF-0626-SM-5B47S    ...
gene1           33.2                         23.2               ...

И у меня есть файл списка (list.txt), в котором есть имена столбцов, которые я хотел быизвлечь из data.txt в новый файл (results.txt):

**list.txt**    
GTEX-144GN-2326-SM-5B26N
GTEX-145MF-0626-SM-5B47S
GTEX-13OW5-0126-SM-5BEY3
...

Я попробовал следующее решение от пользователя dogbane: Извлечь столбцы из файла на основе заголовка, выбранного из другого файла Но он сгенерировал файл размером 22 ГБ, который я даже больше не мог открыть.

Тогда я попробовал другое решение:

cols=($(sed '1!d;s/, /\n/g' data.txt | grep -nf list.txt | sed 's/:.*$//'))
cut -d ',' -f 1$(printf ",%s" "${cols[@]}") data.txt > result.txt

Но он дал мне только первый столбец.

Тогда у меня возникла такая же проблема:

head -n1 data.txt | tr '\t' '\n' | grep -nf list.txt | cut -f1 -d:   | paste -sd, | xargs -I{} cut -f {} data.txt  > results.txt

Я был бы благодарен, если бы кто-нибудь показал мне более простое и работающее решение.Или, по крайней мере, возможно, указав, какую деталь я просмотрел.Вопрос, вероятно, излишний, но решение здесь может быть иным?

РЕДАКТИРОВАТЬ:

Я нашел способ сделать это в R, но он работает только снебольшая таблица / матрица, но она не работает с матрицей 2 ГБ.С небольшой таблицей этот метод работает.

загрузка таблицы с помощью:

table <- read.table("c:/test.txt")

# then converting first row into headers

colnames(table) <- as.character(unlist(table[1,]))

# loading the list file that contains the column names to be extracted from table

list <- scan("c:/list.txt", character(), quote = "")

#Then extracting columns based on names in list:
results <- table[,list]

Однако, когда я пробую этот метод на моей большой матрице 2 ГБ, я получаю сообщение об ошибке:

results <- table[,list]
Error in `[.data.frame`(table, , list) : undefined columns selected 

Может кто-нибудь дать представление о том, что может генерировать сообщение об ошибке?

Спасибо за ваше терпение и помощь заранее.

...