我有一个文件|分隔,文件有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的区别,但是在其他列上应用一些过滤器后我们如何找到
答案 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