web-dev-qa-db-ja.com

特殊文字を含む値の数を出力します

以下のようなテキストファイルがあります。 2番目の列を確認して、特殊文字が含まれている値の数を出力したいと思います。

101,aaa,d01
102,*&%,d02 
103,$%&,d03
104,###,d04

私はawkで試しました:

awk -F, '{if ($2 ~ (/^[$*&%#]+$/) count+1;} END {print count}' sample.txt

しかし、それは機能していません。 awk以外にそれを行う方法はありますか?

1
user64676

これを行うには多くの方法があります。質問でこれを指定していませんが、awkアプローチは、完全にの特殊文字で構成される2番目のフィールドをカウントしようとしているため、私のソリューションでも同様に実行しています。それが目的ではなく、少なくとも1つの特殊文字を含むフィールドをカウントしたい場合は、一致演算子から^$を削除します。

  1. awk:

    awk -F, '{if($2 ~ /^[$*&%#]+$/) cnt++;} END {print cnt}' sample.txt
    
  2. Perl:

    Perl -F, -lane '$cnt++ if $F[1]=~/^[\$*&%#]+$/; END{print $cnt}' sample.txt
    
  3. grep(これは常に3つのフィールドしかないことを前提としています):

    grep -cP ',[\$*&%#]+,' sample.txt 
    
  4. シェル

    count=0;
    while IFS="," read one two three; do 
        [[ -z ${two##[\*&%\$#]*} ]] && let count++; 
    done < sample.txt; 
    echo $count
    
1
terdon

これはどう

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ではない文字です。

0
user55518

他の人が述べているように、あなたが何をしたいのかは明確ではありません正確にですが、あなたはこうしてあなたのアプローチの構文を修正することができます:

awk -F, '$2 ~ /^[$*&%#]+$/ { count++ } END {print count}' sample.txt
0
user61786