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

时间:2019-02-13 07:23:40

标签: unix awk sed scripting cut

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

如何在col2 = 456和col3 = 789的列1中找到不同记录的计数。

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

5 个答案:

答案 0 :(得分:1)

请您尝试以下。

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

答案 1 :(得分:1)

这是一个简单的Awk脚本。

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

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

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

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

答案 2 :(得分:1)

使用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

超级马里奥的日常面包:

|

答案 3 :(得分:0)

您可以尝试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
$

答案 4 :(得分:0)

与以前的awk解决方案略有不同的逻辑。但也要略微:

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