Если вы переместите файл в каталог, вы сможете удалить каталог с файлом.
mkdir foo
mv filen* foo
rm -rf foo
Интересно, как следует обрабатывать перевод строки в файле. Это считается персонажем или нет?
Если нам просто нужно взять из 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
означает пропустить все строки, начинающиеся с ;
или >
.
$ 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 =
включает режим абзаца , где каждая запись является абзацем (абзацы разделяются последовательностями пустых строк)) и подразумевает загрузку всего файла в память.
Если вы не возражаете против ввода всего содержимого в память, а строка развернута, вы можете использовать подстановку команд, чтобы прочитать ее (спасибо George Vasiliou за tr
улучшение! )
data=$( tr -d '\n' < inputfile )
затем выведите из (нулевого) 10, для длины 70 байт:
printf "%s\n" "${data:9:70}"
Предполагая, что символы новой строки не имеют значения для данных, а просто форматируются в файле (код не тестировался):
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;
}
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
Для байтов (также будет работать для однобайтовых символов -, как в вашем образце):
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