我有一个如下所示的文本文件。我想检查第二列并打印其中包含一些特殊字符的值的计数。
101,aaa,d01
102,*&%,d02
103,$%&,d03
104,###,d04
我尝试使用 awk:
awk -F, '{if ($2 ~ (/^[$*&%#]+$/) count+1;} END {print count}' sample.txt
但它不起作用。除了awk之外还有其他方法吗?
答案1
有很多方法可以做到这一点。您没有在问题中指定这一点,但是您的awk
方法是尝试计算包含的第二个字段完全特殊字符,这也是我的解决方案正在做的事情。如果这不是您想要的,而是您想要对仅包含至少一个特殊字符的字段进行计数,请从匹配运算符中删除^
and 。$
awk:
awk -F, '{if($2 ~ /^[$*&%#]+$/) cnt++;} END {print cnt}' sample.txt
珀尔:
perl -F, -lane '$cnt++ if $F[1]=~/^[\$*&%#]+$/; END{print $cnt}' sample.txt
grep (这个假设总是只有 3 个字段):
grep -cP ',[\$*&%#]+,' sample.txt
壳
count=0; while IFS="," read one two three; do [[ -z ${two##[\*&%\$#]*} ]] && let count++; done < sample.txt; echo $count
答案2
这个怎么样
awk -F, '{if ($2 ~ /[^:alnum:]/) l=length($2);print $0" "l}' sample.txt
101,aaa,d01
102,*&%,d02 3
103,$%&,d03 3
104,###,d04 3
打印每行“特殊字符”的计数,这里的字符不是 alnum。
答案3
正如其他人提到的,目前尚不清楚确切地你想要做什么,但你可以这样修复你的方法的语法:
awk -F, '$2 ~ /^[$*&%#]+$/ { count++ } END {print count}' sample.txt