Подсчет символов в строке после первого результата grep, но удаление новой строки из подсчета

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 -расщепляет и вставляет ' -'между годом и месяцем

2
26.08.2020, 19:19
3 ответа
  • | 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

Между прочим, вероятно, есть много других способов сделать это.

1
18.03.2021, 23:09

Используйте следующий лайнер 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заставляет код пропускать последнюю строку ввода после печати длины строки для ускорения.

СМ. ТАКЖЕ:

perlrun :ключи командной строки

0
18.03.2021, 23:09

Используйте 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
1
18.03.2021, 23:09

Теги

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