У меня есть файл генетических данных gen.gz с 6000 столбцов. Данные выглядят так:

1 1:13380:C:A 13380 C A

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

1 1:13380 13380 C A

Я хочу удалить четыре символа во втором столбце.

Ввод представляет собой файл gen.gz, и я хочу, чтобы вывод был таким же.

0
Kusalananda 18 Ноя 2019 в 14:35
Ограничены ли 6000 полей в файловом пространстве?
 – 
Kusalananda
18 Ноя 2019 в 14:13
Да, они разделены пробелами.
 – 
Doodle
18 Ноя 2019 в 14:20
Файл заархивирован или расширение файла просто совпадение?
 – 
Freddy
18 Ноя 2019 в 14:21
Файл сжат.
 – 
Doodle
18 Ноя 2019 в 14:21
Есть миллионы строк и около 6000 столбцов, сжатых gzip. Есть ли способ редактировать gzip-файлы напрямую или их нужно распаковывать на ходу, а затем сжимать обратно?
 – 
Doodle
18 Ноя 2019 в 14:23

1 ответ

Лучший ответ

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

gzip -d -c gen.gz |
awk '{ sub(":[^:]*:[^:]*$", "", $2); print }' |
gzip -c >new-gen.gz

# look at new-gen.gz, and then

mv new-gen.gz gen.gz   # only if you want to discard the original data!

Код awk может быть выполнен разными способами. Я решил удалить последние две строки с разделителями : из второго поля, а не отрезать последние четыре символа, как вы предложили. Если у вас всегда есть только одиночные символы, регулярное выражение :[^:]*:[^:]*$ может быть записано как :.:.$.

Поскольку вы изменяете данные в сжатом файле, вы не можете редактировать файл на месте (как в случае с sed -i).

1
Kusalananda 18 Ноя 2019 в 14:33
Спасибо. Я попробую это прямо сейчас и вернусь к вам. У меня есть один вопрос... должна ли первая часть кода быть gunzip вместо gzip? Здесь: gzip -d -c gen.gz | awk '{ gsub(":[^:]*:[^:]*$", "", $2); печать }' |
 – 
Doodle
18 Ноя 2019 в 14:26
gunzip -c в этом случае для записи в стандартный вывод, а не в файл, но это именно то, что gzip -c -d уже делает (-d заставляет распаковывать, а не сжимать).
 – 
Kusalananda
18 Ноя 2019 в 14:27
Ох, хорошо! Спасибо..
 – 
Doodle
18 Ноя 2019 в 14:28
Да, я хочу отказаться от исходных данных после редактирования :)
 – 
Doodle
18 Ноя 2019 в 14:33
Работал отлично!!! Большое спасибо!!
 – 
Doodle
18 Ноя 2019 в 14:57