Похоже, что у вас очень длинная строка. Вы можете столкнуться с проблемами при использовании sed и awk, поскольку они съедают доступную память для выполнения этой задачи (зависит от размера файла/длины строки, конечно). Поэтому, используя двухэтапный подход, но с ограничениями по памяти, вы можете использовать tr
, а затем одно из решений awk, perl или sed, описанных выше.
head -20 inputfile |
tr '>' '\n' > stage1
perl -ne 'print ">$1 $2\n" if /^(.*?)([ACGTU]+)$/ && length($2)>1000' < stage1 > output
Когда вы убедитесь, что все работает с первыми 20 строками, сделайте это по-настоящему в одном конвейере:
tr '>' '\n' inputfile |
perl -ne 'print ">$1 $2\n" if /^(.*?)([ACGTU]+)$/ && length($2)>1000' > output
Мой perl-скрипт, возможно, не так эффективен, как другие, но должен справиться с задачей. Я написал его для наглядности. Выведите метку, за которой следует пробел, затем соответствующие пары оснований и новую строку, если и только если есть такая строка, содержащая более 1000 пар оснований.