Попытка awk файла, но не может выделить достаточно памяти.Любые альтернативы или корректировки? - PullRequest
0 голосов
/ 24 сентября 2018

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

awk '/chrM/ { print }' file1.pileup > file1.chrm.pileup

Код ошибки:

awk: (FILENAME=file1.pileup FNR=1743118775) fatal: grow_iop_buffer: iop->buf: can't allocate 137438953474 bytes of memory (Cannot allocate memory)

Есть альтернативная команда или подкоманда, чтобы обойти это?

Спасибо за любую помощь.

Редактировать:

Данные выглядят так:

chr1    258755  T       1       .                 F
chr1    258756  C       1       ......            F
chr1    258757  T       1       ...               H
chr1    258758  A       1       ...........       H

Это 3529769718150 байт.

Я ожидаю найти (в основномряд строк на ~ 70-75% пути вниз):

chrM    6432       C       1       ^~.            B
chrM    7294       A       1       ........       B
chrM    7296       G       1       .....          B

Edit2:

Вывод 'head -n 1 File1 |od -c ':

0000000   c   h   r   1  \t   2   5   8   7   4   9  \t   T  \t   1  \t
0000020   ^   ~   .  \t   C  \n
0000026

Вывод' head -c xxx File1 |od -c ':

head: xxx: invalid number of bytes
0000000

Вывод' head -c 100 File1 |od -c ':

0000000   c   h   r   1  \t   2   5   8   7   4   9  \t   T  \t   1  \t
0000020   ^   ~   .  \t   C  \n   c   h   r   1  \t   2   5   8   7   5
0000040   0  \t   T  \t   1  \t   .  \t   C  \n   c   h   r   1  \t   2
0000060   5   8   7   5   1  \t   T  \t   1  \t   G  \t   C  \n   c   h
0000100   r   1  \t   2   5   8   7   5   2  \t   T  \t   1  \t   .  \t
0000120   F  \n   c   h   r   1  \t   2   5   8   7   5   3  \t   C  \t
0000140   1  \t   .  \t
0000144

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Интересно, удастся ли вам добиться большего успеха, избегая регулярных выражений:

awk '$1 == "chrM"' file1.pileup > file1.chrm.pileup

Интересно, не поврежден ли ваш файл, и где-то в файле есть одна строка, которая составляет 137438953474 байтадолго.Можете ли вы попробовать это:

awk '{print NR, NF, length($0)}' file1.pileup > file1.line_lengths

И посмотрите, где это вылилось?

0 голосов
/ 25 сентября 2018

Похоже, ваша команда grep может не справиться с файлами размером более 2,4 ГБ, поскольку 32-битный указатель не может получить к ним доступ.

Попробуйте запустить

split --line-bytes = 2 ГБ file1.pileup

Это разделит ваш файл на две части, которые вы сможете обрабатывать так, как выкак.

0 голосов
/ 24 сентября 2018

Вы можете просто использовать grep -F (фиксированный текстовый поиск) здесь вместо awk:

grep -wF 'chrM' file1.pileup > file1.chrm.pileup

Если вы действительно хотите использовать awk, тогда более быстрая и короткая команда будет избегать регулярных выражений:

awk 'index($0, "chrM")' file1.pileup > file1.chrm.pileup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...