使用文件中的过滤器获取文件中的记录数
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
我有一个文件 |分隔,文件有 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