Unix 使用文件中的筛选器获取文件中记录的计数
我有一个文件|分隔,文件有4列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 &
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
'ncut
'nsort
'nwc
'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
'ncut
'nsort
'nwc
'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