以下のテキストファイルがあります。 2番目の列をチェックして、特殊文字を含む値の数を出力したいと思います。
101,aaa,d01
102,*&%,d02
103,$%&,d03
104,###,d04
私はawkを使ってみます:
awk -F, '{if ($2 ~ (/^[$*&%#]+$/) count+1;} END {print count}' sample.txt
しかし、うまくいきません。 awk以外の方法はありませんか?
答え1
これを行う方法はいくつかあります。あなたの質問にこれを指定しませんでしたが、あなたのawk
アプローチは、以下を含む2番目のフィールドを計算することです。完全特殊文字は、まさに私の解決策が行うことです。これが望ましくなく、1つ以上の特殊文字を含むフィールドのみを計算するには、一致^
演算子からおよびを削除します。$
奇妙な:
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でない場合は、1行あたりの「特殊文字」の数を印刷します。
答え3
他の人が述べたように、明確ではありません。正確にやりたいことですが、次のようにメソッド構文を変更できます。
awk -F, '$2 ~ /^[$*&%#]+$/ { count++ } END {print count}' sample.txt