50000を超える行を含むcsvファイルがあります。これは単なる例です。
Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg
.
.
.
私の仕事は次のとおりです。各行の区切り文字「、」の数が7以外の場合は、行番号を印刷する必要があります。
これを行うためにawkラインまたはperlラインを生成することは可能ですか?
echoやcatを使って時間を費やす必要はありません。
答え1
awkを使うととても簡単です。区切り文字を設定してから、-F','
NFを使用して列数を計算できます。 7つのカンマには8つのフィールドが必要で、NRを使用して現在の行番号を印刷します。
awk -F ',' 'NF != 8 {print NR}' test.txt
test.txtの内容
Dcccrev,wefrwvfr,rfregt,wr4f,rfvrv,ecxwec,ecfrv,rfrf
Grge,gtgr,frfrv,gthtgv,gerg5tgvrt,rvrfvtg,tgt,frfrf,rfrf
Drfrfr,t,tgtg,rf,rgr,grtg,tgt,gtgtg,rg
出力
2
3
答え2
Perl の s/// 演算子 (tr///(y/// とも呼ばれる) を使用することもできます) は、実行された代替回数を返します。同様に、m//演算子は一致数を返します。
perl -lne 's/,//g == 7 or print $.' yourfile
perl -lne 'print $. if 7 != (() = /,/g)' yourfile
sed -ne 's/[^,]//g; /^.\{7\}$/!=' yourfile