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+0
count
修正版は
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