Как посчитать количество уникальных полей в CSV-файле с неравным количеством столбцов в каждой строке - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть CSV-файл, содержащий извлечение переменных для файлов в определенном каталоге.Таким образом, количество столбцов в строке может быть разным, например:

filename1,variable1,variable2,variable3,variable4
filename2,variable1,variable2,variable5
filename3,variable1,variable5,variable6,variable7,variable8

(конечные запятые удалены)

Команда:

awk -F ',' "{print NF}" < input.csv 

Не делать на самом делехитрость, поскольку он просто отображает количество столбцов для «самой большой» строки в файле для всех строк.

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

Идеальный результат для первого запроса будет выглядеть примерно так:

filename1   4
filename2   3
filename3   5

Идеальный результат для второго запроса (количество уникальных полей во всем файле):

8

Какие-нибудь отличные идеи о том, как подойти к этому?

Спасибо,

С наилучшими пожеланиями, Биргитте

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Это может быть медленнее, чем один awk сценарий, но всегда приятно иметь альтернативу:

Количество уникальных переменных во всем файле

$ cut -d, -f2- file | tr , \\n | sort -u | wc -l
8

Количество переменныхза линию

$ paste \
   <(cut -d, -f1 file) \
   <(grep -no , file | uniq -c | tr -s ' ' \\t | cut -f2)
filename1   4
filename2   3
filename3   5
0 голосов
/ 14 декабря 2018

Ваши два требования могут быть выполнены за один раз:

awk -F, '{for(i=2;i<=NF;i++)a[$i]}{print $1, NF-1}
         END{print "total unique vars:"length(a)}' file.csv

С вашими примерами данных в качестве входных данных мы получили:

filename1 4
filename2 3
filename3 5
total unique vars:8

Если вы хотите разделить их на два cmds:

awk -F, '{print $1, NF-1}' file.csv

И

awk -F, '{for(i=2;i<=NF;i++)a[$i]}END{print length(a)}' file.csv
...