unix: получить символы от 10 до 80 в файле

Если вы переместите файл в каталог, вы сможете удалить каталог с файлом.

mkdir foo 
mv filen* foo
rm -rf foo
4
13.04.2017, 15:36
6 ответов

Интересно, как следует обрабатывать перевод строки в файле. Это считается персонажем или нет?

Если нам просто нужно взять из 10 байта и напечатать 71 байт (A,C,T,G и перевод строки), то решение Сато Кацура будет самым быстрым (здесь предполагается, что GNU dd или совместимо с status=none, замените на 2> /dev/null (хотя это также скроет сообщения об ошибках, если таковые имеются) с другими реализациями):

 dd if=file bs=1 count=71 skip=9 status=none

Если перевод строки нужно пропустить, отфильтруйте их out с tr -d '\n':

 tr -d '\n' < file | dd bs=1 count=70 skip=9 status=none

Если Fasta-заголовок следует пропустить, то это:

 grep -v '^[;>]' file | tr -d '\n' | dd bs=1 count=70 skip=9 status=none

grep -v '^[;>]' file означает пропустить все строки, начинающиеся с ; или >.

6
27.01.2020, 20:44
$ cat file1
GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

проверить длину каждой строки

$ awk '{print length,$0}' file1
70 GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
70 GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
70 GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

напечатать символы 10-80

$ awk '{print substr($0,10,70)}' RS= file1
TGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCC

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

7
27.01.2020, 20:44

Если вы не возражаете против ввода всего содержимого в память, а строка развернута, вы можете использовать подстановку команд, чтобы прочитать ее (спасибо George Vasiliou за tr улучшение! )

data=$( tr -d '\n' < inputfile )

затем выведите из (нулевого) 10, для длины 70 байт:

printf "%s\n" "${data:9:70}"
3
27.01.2020, 20:44

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

BEGIN {
  linesize=70;
  start=10;
  end=80;
}
// {
  if ((NR>=int(start/linesize) && (NR<=int(end/linesize)) {
     from = NR==int(start/linesize) ? start % linesize : 0;
     to   = NR==int(end/linesize) ? (end % linesize)-from : linesize+1;
     print substr($0, from, to);
  }
  if (NR==int(end/linesize)) exit;
}
2
27.01.2020, 20:44
perl -l -0777pe '
   my($start, $stop) = qw/10 80/; $delta = $stop - $start--;
   (undef, $_, $a) = unpack "A${start}A${delta}A*";
   $_ .= $1 while length() - y/\n/\n/ < $delta and $a =~ /(.)/g;
'  scaffolded_file_10
2
27.01.2020, 20:44

Для байтов (также будет работать для однобайтовых символов -, как в вашем образце):

dd bs=1 skip=9 count=71 < file 2> /dev/null

Или более эффективно с GNUdd:

dd iflag=fullblock,skip_bytes,count_bytes skip=9 count=71 status=none < file

Для символов сzsh:

{
  IFS= read -ru0 -k9 discard &&
    IFS= read -ru0 -k71 text &&
    printf %s $text
} < file

(ничего не напечатает, если в файле меньше 80 символов ).

ksh93и bashимеют параметр -N, аналогичный zshдля -k, но они не поддерживают символы NUL, а вариант bashсодержит ошибки .

С GNUawk:

awk -v RS='.{1}' -v ORS= 'NR>=10 {print RT}; NR == 80 {exit}'

Мы используем .{1}, так как ., будучи одним символом, не будет рассматриваться как регулярное выражение.

Другим вариантом является преобразование в кодировку символов с фиксированным числом байтов на символ (и всеми возможными символами ), например UTF -32LE с 4 байтами на символ :

.
< file iconv -t UTF-32LE |
   dd bs=4 skip=9 count=71 2> /dev/null |
   iconv -f UTF-32LE
5
27.01.2020, 20:44

Теги

Похожие вопросы