подсчитайте и напечатайте частоту «0», «1» и «NA» в каждой строке после строки заголовка

Вы можете:

sed 's/[^:]*/"&"/g' /etc/passwd

То есть заключать в кавычки любую последовательность из 0 или более(*)символов, кроме:([^:]).

Или с помощью специального инструмента обработки csv -, который имеет преимущество правильного цитирования (полей стиля csv -), содержащих символы двойных кавычек, а здесь также добавление заголовка:

mlr --icsvlite --ocsv --implicit-csv-header --fs : --quote-all label \
  'User Name,Password,UID,GID,Gecos,Home Directory,Shell' /etc/passwd
0
28.10.2021, 18:52
1 ответ
awk 'BEGIN{ FS=OFS="\t" }
    NR==1 { print $0, "0s", "1s", "NAs" }
     NR>1  { for(i=7; i<=NF; i++) { NAs+=$i=="NA"; ones+=$i==1; total++ };
             print $0, total-ones-NAs, ones, NAs; NAs=ones=total=0;
}' infile >outfile

NAsпеременная подсчитывает количество вхождений "NA".
onesпеременная подсчитывает количество вхождений «1».
totalподсчитывает общее количество посещенных полей от 7 до-последних полей (это можно было бы убрать, но я использовал для ясности*).
total-ones-NAs— это количество «0» (путем вычитания единиц и NA из общего количества ). NAs=ones=total=0сбрасывает переменные для следующей строки.


*:мы могли бы удалить total++и заменить total-ones-NAsна NF-6-ones-NAs.

1
28.10.2021, 20:36

Теги

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