Шаблоны – Bash: Подсчитать Количество Слов В Каждой Строке Документа

  • Автор темы Cristals
  • Обновлено
  • 22, Oct 2024
  • #1

Мне нужно выявить закономерности в текстовом файле для дальнейшего анализа. Таким образом, входные файлы могут содержать полуструктурированный текст следующим образом:

файл1

 
 
 
 
 | [email protected] | er34532 |  
| [email protected] | 764474 |
 

файл2

- | : \space+ \tab+

количество слов в строке может различаться для каждого документа. разделитель также различается, но уникален для каждого документа. я хочу подсчитать количество слов в каждой строке в каждом документе.

вывод будет:

для файла1

4 4 4 4

для файла2

5 5 5 5

Я хочу обобщить это для любого файла с любым разделителем. Это может быть nathen <tab> [email protected] <tab> 764323545 <tab> UK thomas <tab> [email protected] <tab> 563363421 <tab> UK ian <tab> [email protected] <tab> 3453245472 <tab> SP .

Некоторые файлы следующие:

905:john: abc123: [email protected]: US 920:eric: ericaA: [email protected]: US 1000: rio: ri0ri0: [email protected]: IN

#bash #шаблоны

Cristals


Рег
01 Oct, 2007

Тем
70

Постов
200

Баллов
560
  • 25, Oct 2024
  • #2

Для файла file2 с его простым форматом слов, разделенных пробелами, попробуйте:

 
 
 
 
 
 $ cat file3
| [email protected] | er34532 |  
| [email protected] | 764474 |
$ awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' file3
2
2
 

В АВК, awk -F'[-|: \t]+' '{gsub(/^[[-\|: \t]+|[[-\|: \t]+$/, ""); print NF}' is the number of fields. In awk by default, words characters separated by white-space.

Для файла1, в котором слова могут быть разделены двоеточиями или пробелами, нам нужно добавить gsub to the field separator:

[[:space:]]+$

Улучшение

awk подумает, что есть дополнительные поля, если в строке есть пробелы в начале или в конце. Мы можем это исправить, удалив все такие пробелы перед подсчетом полей, как это показано в файле file1:

^[[:space:]]+

или это для файла2:

awk '{gsub(/^[[:space:]]+|[[:space:]]+$/, ""); print NF}' file2

В регулярном выражении awk -F'[: \t]+' '{gsub(/^[: \t]+|[: \t]+$/, ""); print NF}' file1 matches leading whitespace and $ awk -F'[: \t]+' '{print NF}' file1 5 5 5 соответствует завершающему пробелу. Их сочетание в : command removes both.

Обобщение

Если разделителем полей может быть любой из символов - | : или , затем используйте:

NF

Пример:

$ awk '{print NF}' file2 4 4 4
 

User54


Рег
14 Mar, 2006

Тем
83

Постов
208

Баллов
643
  • 25, Oct 2024
  • #3

Вы могли бы использовать этот трюк в perl для подсчета подстрок, соответствующих регулярному выражению слова по вашему выбору, например. подсчитывать последовательности «слов», состоящих из Perl

 
 
 $ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file2
4
4
4
 
character set augmented with $ perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' file1 5 5 5 и perl -lne 'print my $count = () = $_ =~ /[\w@.]+/g' somefile

.

что дает

@

и

\w

для ваших образцов файлов.

 

Acchueucelr49


Рег
31 Jan, 2011

Тем
56

Постов
206

Баллов
526
Тем
403,760
Комментарии
400,028
Опыт
2,418,908