Мы хотим подмножить текстовый файл в строках и столбцах, где строки и столбцы считываются из файла. Исключая заголовок (строка 1) и имена ростов (col 1).
inputFile.txt Текстовый файл с разделителями табуляции
header 62 9 3 54 6 1
25 1 2 3 4 5 6
96 1 1 1 1 0 1
72 3 3 3 3 3 3
18 0 1 0 1 1 0
82 1 0 0 0 0 1
77 1 0 1 0 1 1
15 7 7 7 7 7 7
82 0 0 1 1 1 0
37 0 1 0 0 1 0
18 0 1 0 0 1 0
53 0 0 1 0 0 0
57 1 1 1 1 1 1
subsetCols.txt Запятая разделена без пробелов, одной строки, упорядоченных чисел. В реальных данных у нас есть 500K столбцов и нужно подмножество ~ 10K.
1,4,6
subsetRows.txt Запятая разделена без пробелов, одной строки, упорядоченных чисел. В реальных данных у нас есть 20K строк и нужно подмножество около ~ 300.
1,3,7
Текущее решение с использованием цикла cut и awk (Связанное сообщение: выберите строки с помощью awk):
# define vars
fileInput=inputFile.txt
fileRows=subsetRows.txt
fileCols=subsetCols.txt
fileOutput=result.txt
# cut columns and awk rows
cut -f2- $fileInput | cut -f`cat $fileCols` | sed '1d' | awk -v s=`cat $fileRows` 'BEGIN{split(s, a, ","); for (i in a) b[a[i]]} NR in b' > $fileOutput
Выходной файл: result.txt
1 4 6
3 3 3
7 7 7
Вопрос:
Это решение отлично подходит для небольших файлов, для больших файлов 50K строк и 200K столбцов, занимает слишком много времени, 15 минут плюс, все еще работает. Я думаю, что вырезать ting столбцы отлично работают, выбор строк - медленный бит.
Лучший способ?
Информация о реальных входных файлах:
# $fileInput:
# Rows = 20127
# Cols = 533633
# Size = 31 GB
# $fileCols: 12000 comma separated col numbers
# $fileRows: 300 comma separated row numbers
Дополнительная информация о файле: файл содержит данные генотипа GWAS. Каждая строка представляет образец (индивидуальный), и каждый столбец представляет SNP. Для дальнейшего анализа на основе регионов нам нужно подмножество выборок (строк) и SNP (столбцов), чтобы сделать данные более управляемыми (малыми) в качестве ввода для других статистических программ, таких как r.
Система:
$ uname -a
Linux nYYY-XXXX ZZZ Tue Dec 18 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU/Linux
Обновление: Решение, приведенное ниже @JamesBrown, смешивало заказы столбцов в моей системе, так как я использую другую версию awk, моя версия: GNU Awk 3.1.7