Unix awk - количество вхождений для каждого уникального значения - PullRequest
0 голосов
/ 22 октября 2018

В Unix я печатаю уникальное значение для первого символа в поле.Я также печатаю количество уникальных длин полей. Теперь я хотел бы сделать оба вместе. Легко сделать в SQL, но я не уверен, как это сделать в Unix с помощью awk (или grep, sed, ...).

ПЕЧАТЬ ПЕРВЫХ УНИКАЛЬНЫХ ВЕДУЩИХ ЧАР

awk -F'|' '{print substr($61,1,1)}' file_name.sqf | sort | uniq

ПЕЧАТЬ СЧЕТА ПОЛЕЙ С ДЛИНАМИ 8, 10, 15

awk -F'|' 'NR>1 {count[length($61)]++}  END {print count[8] ", " count[10] ", " count[15]}' file_name.sqf | sort | uniq

ЖЕЛАЕМЫЙ ВЫХОД

first char, length 8, length 10, length 15
a, 10, , 150
b, 50, 43, 31
A, 20, , 44
B, 60, 83, 22

Поля, которыеначинаются с верхнего или нижнего «а», никогда не имеют длины 10.

Входной файл представляет собой |с разделителями .sqf без заголовка.Поле является varChar 15.

пример ввода

56789 | someValue | aValue | otherValue | 712345
46789 | someValue | bValue | otherValue | 812345
36789 | someValue | AValue | otherValue | 912345
26789 | someValue | BValue | otherValue | 012345
56722 | someValue | aValue | otherValue | 712345
46722 | someValue | bValue | otherValue | 812345

желаемый вывод

a: , , 2
b: 1, , 1
A: , , 1
B: , 1,

'a' имеет два экземпляра длиной 15 'b' имеет один экземпляркаждая длина 8 и 15 'A' имеет один экземпляр, длина 15 'B' имеет один экземпляр длиной 10

Спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Я думаю, вам нужен лучший пример входного файла, но я думаю, это то, что вы ищете

$ awk -F' \\| ' -v OFS=, '{k=substr($3,1,1); ks[k]; c[k,length($3)]++}
                      END {for(k in ks) print k": "c[k,6],c[k,10],c[k,15]}' file

A: 1,,
B: 1,,
a: 2,,
b: 2,,

обратите внимание, что, поскольку все длины равны 6, я напечатал это число вместо 8. Справильные данные, вы должны быть в состоянии получить ожидаемый результат.Обратите внимание, что порядок не сохраняется.

...