awk - 列全体のパターン数の計算

awk - 列全体のパターン数の計算

2つの列を持つ次のcsvファイルがあります。

Header1,Header2
AU3CB0222255,EBFXFR
AU3CB0222271,DBFXFR
AU3CB0225233,DBFXFR
AU3CB0225662,DBFXFR
AU3CB0226264,DBFXFR

で始まらない2列のフィールド数を計算したいと思いますE

次のコマンドを試しましたが、正しく機能しません。

awk '$2 !~ /^E_/ { count++ }END{ print count }' FinalOutput.csv

答え1

コマンドawkにはいくつかの問題があります。

  • フィールド区切り文字を指定しなかったため、awk代わりにスペースに行が分割されます,-F','コマンドラインオプションを使用してフィールド区切り文字を設定できます。
  • あなたの正規表現には、次に始まらないフィールド(列2の値なし)を見つける/^E_/ように指定されています。E_いいえで始まらないものだけですE。削除する_
  • コマンドはヘッダー行も計算します。FNR内部変数を使用できます(現在行番号に自動的に設定されます)。現在のファイル内で) は最初の行を除外します。
  • Rakesh Sharmaが指摘したように、みんなで始まる行の場合、初期化されていない変数を使用すると、Eコマンドは最後に空の文字列を出力します。代わりに印刷して強制的に数値として解釈する0ことができます。count+0count

修正版は

awk -F',' 'FNR>1 && $2!~/^E/{count++} END{print count+0}' FinalOutput.csv

FNRグローバルラインカウンタの代わりにファイル固有のラインカウンタを使用したため、NRこれはすべてのファイルにヘッダ行を持つ複数の入力ファイルでも機能します。つまり、次のように使用することもできます。

awk -F',' ' ... ' FinalOutput1.csv FinalOutput2.csv ...

答え2

他の方法:

  • awk条件が true の場合はデフォルトで印刷されるので、単に次のことができます。

    $ awk -F, 'NR>1 && $2!~/^E/' file | wc -l
    4
    
  • 2行目から始まるファイルを印刷し、コンマの後にE以外の文字が表示される回数を数えます(例に示すように、1行に1つのコンマしかないとします)。

    $ tail -n+2 file | grep -c ',[^E]'
    4
    
  • perl

    $ perl -F, -lane '$c++ if $.>1 && $F[1] !~ /^E/ }{ print $c' file
    4
    
  • sedそしてwc

    $ sed -n '1d; /,[^E]/p' file | wc -l
    4
    

答え3

あなたは近くにあり、awk -F, 'NR>1{if ($2 !~ /^E/){count++}} END {print count}'働く必要があります。

-F,awkにこれが,区切り記号だと教えてください。

NR>1ストリップのタイトル

サンプルファイルで実行しましたが、正しい出力が生成されました。

答え4

アッファイル全体を飲み込んでください(NR 1にする)。

$ awk -F '\n[^\n]*,[^E]' '{ print NF-1 }' RS='^$' file
4

PCREモードのGNU grep

$ < grep -zoP '\n.*\K,[^E]'  | xargs -r0 -n1 | wc -l
4

フルルックサウンドモードのPerl

$ perl -F'\n.*,[^E]' -pal -0777e '$_=$#F' file 
4

POSIX grep /ヘッダー

$ { head -n 1 > /dev/null; grep -c ',[^E]'; } < file
4

GNU sed拡張正規表現モードで

$ sed -Ee "
    1d;/,[^E]/{z;H;}
    \$!d;g;y/\n/d/
    :a
      s/d{10}/#/g
      s/#([0-9]*)$/#0\1/
      $(seq 9 -1 1 | xargs -I {} printf 's/d{%d}/%d/;' {} {})
      y/#/d/
    ta
    s/^\$/0/
" file
4

関連情報