sed -e 's/^ (. ), (. ), (.)/\2/g' -e 's/ ([0 -9]{1,2} )([0 -9]{4} )/\1 -\2/g' файл*
с/^ (. ), (. ), (. *)/\2/g -разбивается на основе запятых и получает второе значение s/ ([0 -9] {1,2} )([0 -9] {4} )/\1 -\2/g -расщепляет и вставляет ' -'между годом и месяцем
| wc -l
печатает количество строк. | wc -c
выводит количество символов, включая новую строку. | wc -lc
сначала печатает (число строк ). Таким образом, вы можете просто вычесть их:(написать вместо|wc -c
)
| wc -lc | awk '{print $2 - $1}'
Если вы печатаете свою последовательность только в одной строке, вы можете вычесть 1 вместо количества новых строк.
Или вы можете использовать только awk
, сопоставить всю строку и подсчитать ее символы:
| awk '{match("[A-Z]*");print RLENGTH}'
RLENGTH
— это длина совпадения (здесь, это вся строка ). Здесь я предполагаю, что вы используете только заглавные буквы, иначе используйте .
вместо [A-Z]
.
В текстовом редакторе vim
(, поэтому он может быть несовместим с вашим скриптом ),визуально выберите свою область (одну строку или несколько )и запустите:
:'<,'>s/[A-Z]*//gn
Вы также можете удалить символы новой строки с помощьюtr
(также работает для нескольких строк):
| tr -d '\n' | wc -c
Между прочим, вероятно, есть много других способов сделать это.
Используйте следующий лайнер perl one -, который печатает имя файла и длину второй строки, разделенные запятой -. Новые строки удаляются с помощью флага -l
:
for i in *.fas; do perl -lne 'if ( $. == 2) { print join ",", $ARGV, length $_; last LINE; }' $i ; done
Вход:
cat > file1.fas <<EOF
>species1
AICGICVIAGIAIYIAAICG
>species2
AICGIVVYICAGAYICAGCG
EOF
cat > file2.fas <<EOF
>species1
AIG
>species2
GCI
EOF
Выход:
file1.fas,20
file2.fas,3
Оболочка perl one -использует эти флаги командной строки:-e
:указывает Perl искать код в строке -, а не в файле. -n
:перебирает ввод по одной строке за раз, назначая его на $_
по умолчанию. -l
:удалите разделитель входных строк("\n"
на *NIX по умолчанию )перед выполнением кода в строке -и добавьте его при печати.
$ARGV
— имя текущего входного файла. length $_
— это длина текущей строки, которая была выбрана в качестве входной строки номер 2($. == 2
). last LINE
заставляет код пропускать последнюю строку ввода после печати длины строки для ускорения.
СМ. ТАКЖЕ:
Используйте find
для поиска файлов.fas, и команда find поместит их в командную строку awk столько, сколько awk может принять за раз. Таким образом, количество вызовов awk сведено к минимуму.
$ find. -maxdepth 1 -type f -name '*.fas' -exec \
awk -v OFS=, 'FNR==2{print FILENAME, length();nextfile}' {} +
Выход:
./file1.fas,20
./file2.fas,3