Получить количество записей в файле с фильтром в файле - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть файл |Разделенный файл имеет 4 столбца

123|456|789|234
456|456|789|2345
124|456|789|2345
125|456|789|2345
126|456|789|2345
128|451|782|2345

Вывод -> 6

Как найти количество отдельных записей в столбце 1, где col2 = 456 и col3 = 789.

Я знаю, как найти отличительные признаки col1 для всего файла, но как мы находим после применения какого-либо фильтра к другому столбцу

Ответы [ 5 ]

0 голосов
/ 13 февраля 2019

Немного другая логика, чем в предыдущих решениях awk.Но, кроме того, немного:

awk -F '|' '($2!=246 || $3!=789){next}!a[$1]++{c++}END{print c}' file
0 голосов
/ 13 февраля 2019

Вы можете попробовать Perl

perl -lne ' /^(.+?)\|(.+?)\|(.+?)\|/ and $2==456 and $3==789 and $kv{$1}++ ; END { print scalar keys %kv } ' 

с заданными входами

$ cat vijiy.txt
123|456|789|234
456|456|789|2345
124|456|789|2345
125|456|789|2345
126|456|789|2345
128|451|782|2345
$ perl -lne ' /^(.+?)\|(.+?)\|(.+?)\|/ and $2==456 and $3==789 and $kv{$1}++ ; END { print scalar keys %kv } ' vijiy.txt
5
$
0 голосов
/ 13 февраля 2019

Вот простой скрипт Awk.

awk -F '|' '$2=="456" && $3=="789" { if (!a[$1]++) count++ }
    END { print count }' file

В вашем примере данных содержатся 5 различных значений в столбце 1 с этими ограничениями.

Если вы хотите передать значения в качестве параметров,

c2="456"
c3="789"
awk -F '|' -v col2="$c2" -v col3="$c3" '$2==col2 && $3==col3 {
        if (!a[$1]++) count++ }
    END { print count }' file

Массив a собирает ключи из столбца 1, который мы уже видели.Если массив уже не содержит значения первого столбца, мы добавляем 1 к count.

0 голосов
/ 13 февраля 2019

Использование grep 'n cut' n sort 'n wc' на пачку труб:

$ grep ^[^\|]*\|456\|789\| file | cut -d \| -f 1-3 | sort -u | wc -l
5

Показано:

$ grep ^[^\|]*\|456\|789\| file  # search for ^...|456|789|
123|456|789|234
456|456|789|2345
124|456|789|2345
125|456|789|2345
126|456|789|2345

и трубаэто до

cut -d \| -f 1-3               # to lose the last field
123|456|789
456|456|789
124|456|789
125|456|789
126|456|789

и до

sort -u                        # sort and get unique records
123|456|789
124|456|789
125|456|789
126|456|789
456|456|789

и, наконец,

wc -l                          # count them
5

Ежедневный хлеб Супер Марио:

|
0 голосов
/ 13 февраля 2019

Не могли бы вы попробовать следующее.

awk -F'|' '$2==456 && $3==789 && !a[$1,$2,$3]++{count++} END{print count}' Input_file
...