以下のようなテキストファイルがあります。 2番目の列を確認して、特殊文字が含まれている値の数を出力したいと思います。
101,aaa,d01
102,*&%,d02
103,$%&,d03
104,###,d04
私はawkで試しました:
awk -F, '{if ($2 ~ (/^[$*&%#]+$/) count+1;} END {print count}' sample.txt
しかし、それは機能していません。 awk以外にそれを行う方法はありますか?
これを行うには多くの方法があります。質問でこれを指定していませんが、awk
アプローチは、完全にの特殊文字で構成される2番目のフィールドをカウントしようとしているため、私のソリューションでも同様に実行しています。それが目的ではなく、少なくとも1つの特殊文字を含むフィールドをカウントしたい場合は、一致演算子から^
と$
を削除します。
awk:
awk -F, '{if($2 ~ /^[$*&%#]+$/) cnt++;} END {print cnt}' sample.txt
Perl:
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
これはどう
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ではない文字です。
他の人が述べているように、あなたが何をしたいのかは明確ではありません正確にですが、あなたはこうしてあなたのアプローチの構文を修正することができます:
awk -F, '$2 ~ /^[$*&%#]+$/ { count++ } END {print count}' sample.txt