使用文件中的过滤器获取文件中的记录数

Get count of records in file with a filter in file

我有一个文件 |分隔,文件有 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

如何找到 column1 中 col2=456 和 col3=789 的不同记录数。

我知道如何找到整个文件的 col1 的区别,但我们如何在对其他列应用一些过滤器后找到

能否请您尝试以下。

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

这是一个简单的 Awk 脚本。

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

您的示例数据在第 1 列中包含 5 个具有这些约束的不同值。

如果要将值作为参数传递,

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

数组a 收集我们已经看到的第1 列中的键。如果数组不包含第一列的值,我们将 1 添加到 count.

使用grep'n cut'n sort'n wc'n一堆管道:

$ 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

超级马里奥的日常面包:

|

你可以试试 Perl

perl -lne ' /^(.+?)\|(.+?)\|(.+?)\|/ and ==456 and ==789 and $kv{}++ ; 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 ==456 and ==789 and $kv{}++ ; END { print scalar keys %kv } ' vijiy.txt
5
$

逻辑与之前的 awk 解决方案略有不同。不过比还咯:

awk -F '|' '(!=246 || !=789){next}!a[]++{c++}END{print c}' file