我们有超过 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