Я пытаюсь использовать tr с несколькими наборами и не уверен, как это сделать
Вопрос
Я использовал:
tr -dc [:alpha:] < $fileDoc | wc -c
чтобы сосчитать все буквы,
tr -dc ' ' < $fileDoc | wc -c
чтобы посчитать все пробелы,
tr -dc '\n' < $fileDoc | wc -c
для подсчета всех новых строк в текстовом документе.
Что я хотел бы сделать сейчас, так это посчитать все остальные символы в документе так, как я буду называть все остальное.
Вот текст из этого документа:
Здравствуйте, это тестовый текстовый документ.
123
!@#
Есть ли способ удалить все [:alpha:]
, , и
\n
нашли и подсчитали оставшиеся символы?
Решение
Это должно сделать трюк
tr -d '[:alpha:] \n' < $fileDoc | wc -c
.
или, возможно, если вы хотите включить вкладки в определении пробелов
tr -d '[:alpha:][:space:]' < $fileDoc | wc -c
.
На основании комментариев ОП, чтобы удалить алфавитные, пробелы, цифры и новинки и подсчитать все оставшиеся символы:
tr -d '[:alnum:][:space:]' < $fileDoc | wc -c
.
[:alnum:]
Учетные записи для букв алфавита и цифр.[:space:]
заботится обо всем пробеле, включая Newlines
Другие советы
Просто публикую здесь для справки, если вы хотите сделать все одним выстрелом, то это awk
скрипт должен работать:
awk -v FS='' '
{
for(i=1; i<=NF; i++) {
if($i ~ /[a-zA-Z]/) {alpha++};
if($i == " ") {space++};
if($i !~ /[A-Za-z0-9 ]/) {spl++}
}
}
END {
printf "Space=%s, Alphabets=%s, SplChars=%s, NewLines=%s\n", space, alpha, spl, NR
}' file
$ cat file
This is a text
I want to count
alot of $tuff
in 1 single shot
$ awk -v FS='' '
{
for(i=1; i<=NF; i++) {
if($i ~ /[a-zA-Z]/) {alpha++};
if($i == " ") {space++};
if($i !~ /[A-Za-z0-9 ]/) {spl++}
}
}
END {
printf "Space=%s, Alphabets=%s, SplChars=%s, NewLines=%s\n", space, alpha, spl, NR
}' file
Space=11, Alphabets=45, SplChars=1, NewLines=4