Unix 使用文件中的筛选器获取文件中记录的计数

Unix 使用文件中的筛选器获取文件中记录的计数,unix,awk,sed,scripting,cut,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的不同部分,但是在其他列上应用了一些过滤器之后,我们如何找到呢 awk -F'|' '$2==456 && $3==789 &

我有一个文件|分隔,文件有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的不同部分,但是在其他列上应用了一些过滤器之后,我们如何找到呢

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

你能试试下面的吗

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

下面是一个简单的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

下面是一个简单的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列中的键。如果数组尚未包含第一列的值,我们将使用
grep
'n
cut
'n
sort
'n
wc
'n在一组管道中向
count

添加1:

$ 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
超级马里奥每日面包:

|

在一堆管道上使用
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 $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
$
你可以试试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
$

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

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

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

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

@Vijiy,一定要创建一个索引为$1、$2和$3的数组![…]]++表示条件只有在数组中出现这3项中的第一项时才为真,一旦条件为真,则变量count的值将增加1,并在结尾部分打印count的值。@Vijiy,也将在几分钟后在我的帖子中添加完整的解释。这似乎不起作用,我从所有行中获得唯一计数。事实上,我看不到任何按列筛选的尝试。键$2和$3是多余的,但如果删除它们,您将获得我发布的内容。@tripleee这些键不是多余的,它们是必需的(
$1
)可能已经存在于前两个条件不满足的情况下,这可能会使您错过。如果
cond1
在表达式中失败为
cond1&&cond2
(或是否存在?)@Vijiy,则没有任何规定不应计算
cond2
,请确保创建索引为$1、$2和$3的数组,并且![…]]++表示条件只有在数组中出现这3项中的第一项时才为真,一旦条件为真,则变量count的值将增加1,并在结尾部分打印count的值。@Vijiy,也将在几分钟后在我的帖子中添加完整的解释。这似乎不起作用,我从所有行中获得唯一计数。事实上,我看不到任何按列筛选的尝试。键$2和$3是多余的,但如果删除它们,您将获得我发布的内容。@tripleee这些键不是多余的,它们是必需的(
$1
)可能已经存在于前两个条件不满足的情况下,这可能会使您错过。如果
cond1
在表达式中失败为
cond1&&cond2
(或是否存在?)则没有任何规定不应计算
cond2
。是否要输出5,应跳过最后一行?是否要输出5,应跳过最后一行?使用固定列,可以执行
grep“| 456 | 789 | file | cut d”|-f1 | sort-u | wc-l
使用固定列,您可以执行
grep“| 456 | 789 |”file | cut-d”|“-f1 | sort-u | wc-l