2016-01-18 5 views
1

У меня есть большой текстовый файл (от 5 ГБ до 35 ГБ). Я хочу объединить эти файлы по столбцам (или лучше объединить их). Все файлы имеют столбец идентификатора, и они имеют одинаковые записи в этом столбце, поэтому их можно объединить. Файлы выглядят следующим образом:Слияние больших текстовых файлов по столбцу идентификатора

Файл 1 (файлы более 1000 столбцов, разделенных символами табуляции):

ID   col1 col2 
ab1000025 1  2 
ab1000053 2  3 
ab1250223 3  1 

Файл 2:

ID   col3 col4 
ab1000025 2  2 
ab1000053 2  1 
ab1250223 3  1 

Я попробовал два способа:

  1. Я использовал Python с рамками данных pandas. К сожалению, размер файлов увеличивается, когда они считываются как pd.dataframe. Я работаю на сервере, но машина все еще недостаточно. Из-за этой проблемы у меня возникла другая идея ...

  2. Я отсортировал файлы, используя команду сортировки bash, а затем хочу их объединить. К сожалению, это проблема при сортировке моих файлов. Проблема, которая у меня есть, заключается в том, что команда sort не сортирует все файлы одинаково. Реальная проблема в записи, подобные этим:

    ab100005 
    ab1000050 
    

Я доказал идентификатор с R, после сортировки. Я извлек только столбец идентификатора, прочитал его в R, а затем сравнил столбцы со всеми файлами, и кажется, что он иногда сортирует ab100005 до ab1000050 и что-то позади. Я не уверен на 100%, если это проблема с извлечением или чтением его в R, но я думаю, что не потому, что я проверял также исходные отсортированные файлы и на одной и той же позиции (номер строки) - разные записи в разных файлах. Этого не должно быть.

Команда сортировки я использовал:

sort -t$'\t' -k1,1 -n file.txt 

или

sort -t$'\t' -k1,1 -h file.txt 

Может быть, кто-то имеет совершенно иную идею объединить файлы (с помощью Баша, Python, или R). Это было бы прекрасно. Нужный выход из двух файлов выше будет:

ID   col1 col2 col3 col4 
ab1000025 1  2  2  2 
ab1000053 2  3  2  1 
ab1250223 3  1  3  1 
+0

ли все файлы имеют одинаковые идентификаторы (игнорируя вопрос заполнения вы отметили) и, следовательно, такое же количество строк (строк) ? – Gopala

+0

Да, у них одинаковое количество строк. – Tobias

ответ

0

Вы можете использовать что-то вроде этого, предполагающих всех ваших файлов, которые вы пытаетесь читать имеют скороговорки .csv:

l <- do.call(cbind, lapply(list.files('.', pattern = '.csv'), 
      function(x) read.csv(x, sep = ' '))) 
df <- df[, -4] 
df 
     ID col1 col2 col3 col4 
1 ab1000025 1 2 2 2 
2 ab1000053 2 3 2 1 
3 ab1250223 3 1 3 1 

Убедитесь, что у вас достаточно памяти, чтобы читать все.

3

Предполагая, что файлы правильно отформатированы и оба файла имеют одинаковые идентификаторы (внутреннее соединение)

join f1.tsv f2.tsv 
Смежные вопросы