Подсчитайте число ';' в столбце - PullRequest
0 голосов
/ 21 февраля 2020

Я использую следующую команду для подсчета числа ; в первой строке файла:

awk -F';' '(NR==1){print NF;}' $filename

Я хотел бы сделать то же самое со всеми строками в одном файле. То есть подсчитайте число ; во всей строке файла.

Что у меня есть:

$ awk -F';' '(NR==1){print NF;}' $filename
11

Что бы я хотел иметь:

11
11
11
11
11
11

Ответы [ 4 ]

2 голосов
/ 21 февраля 2020

Прямой метод подсчета ; на строку должен быть:

awk '{print gsub(/;/,"&")}' Input_file

Чтобы удалить пустые строки, попробуйте:

awk 'NF{print gsub(/;/,"&")}' Input_file

Чтобы сделать это способом OP, уменьшите 1 из значения из NF:

awk -F';' '{print (NF-1)}' Input_file

ИЛИ

awk -F';' 'NF{print (NF-1)}' Input_file
1 голос
/ 21 февраля 2020

Другой подход с использованием tr и wc:

$ tr -cd ';' < file | wc -c
42
1 голос
/ 21 февраля 2020

Ваш код возвращает число на единицу больше, чем число точек с запятой; NF - это число полей, которые вы получаете, разделяя точку с запятой (например, если есть одна точка с запятой, строка разбивается на две части).

Если вы хотите добавить это число из каждой строки это просто;

awk -F ';' '{ sum += NF-1 } END { print sum }' "$filename"

Если количество полей одинаково, вы также можете просто посчитать количество строк и умножить;

awk -F ':' 'END { print NR * (NF-1) }' "$filename"

Но это, очевидно, неправильно, если вы можете ' t гарантировать, что все строки содержат одинаковое количество полей.

0 голосов
/ 21 февраля 2020

Я бы сказал, что вы можете решить вашу проблему следующим образом:

awk -F';' '{if (NF) {a += NF-1;}} END {print a}' test.txt

Вы хотите вести текущий подсчет всех выполненных вхождений (переменная a).

Так как NF вернет количество полей, которое на одно больше количества разделителей, вам нужно будет вычесть 1 для каждой строки. Это часть NF-1.

Однако вы не хотите считать «-1» для строк, в которых вообще нет разделителя. Чтобы пропустить их, вам нужна часть if (NF).

Вот пример (возможно, надуманный):

$ cat test.txt 
;;
; ; ; ;;
; asd ;;a 
a ; ;

$ awk -F';' '{if (NF) {a += NF-1;}} END {print a}' test.txt
12

Обратите внимание на пустую строку в конце (для проверки на отсутствие разделителя) случай).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...