RAH*_*ONI 4 awk text-processing
我有以下带有 2 列的 csv 文件:
Header1,Header2
AU3CB0222255,EBFXFR
AU3CB0222271,DBFXFR
AU3CB0225233,DBFXFR
AU3CB0225662,DBFXFR
AU3CB0226264,DBFXFR
Run Code Online (Sandbox Code Playgroud)
我想计算第 2 列中不以E.
我尝试了下面的命令,但它不能正常工作:
awk '$2 !~ /^E_/ { count++ }END{ print count }' FinalOutput.csv
Run Code Online (Sandbox Code Playgroud)
您的awk命令有几个问题。
awk在空格处拆分行,而不是,. 您可以使用-F','命令行选项来设置字段分隔符。/^E_/,因此将寻求不以启动域E_(其中的第2列的值没有做),不只是那些不下手E。删除_.FNR内部变量(自动设置为当前文件中的当前行号)来排除第一行。E,则该命令将在末尾打印空字符串而不是 a,0因为使用了未初始化的变量。您可以通过打印count+0而不是count.更正后的版本是
awk -F',' 'FNR>1 && $2!~/^E/{count++} END{print count+0}' FinalOutput.csv
Run Code Online (Sandbox Code Playgroud)
请注意,由于我使用了FNR每个文件的行计数器(而不是全局行计数器NR),因此这也适用于多个输入文件,其中所有文件都有一个标题行,即您甚至可以将其用作
awk -F',' ' ... ' FinalOutput1.csv FinalOutput2.csv ...
Run Code Online (Sandbox Code Playgroud)
其他一些方法:
awk 如果条件为真,则默认打印,因此您可以简单地执行以下操作:
$ awk -F, 'NR>1 && $2!~/^E/' file | wc -l
4
Run Code Online (Sandbox Code Playgroud)
从第二行开始打印文件,并计算您看到逗号后跟非 E 字符的次数(请注意,这假设每行只有一个逗号,如您的示例所示):
$ tail -n+2 file | grep -c ',[^E]'
4
Run Code Online (Sandbox Code Playgroud)
perl
$ perl -F, -lane '$c++ if $.>1 && $F[1] !~ /^E/ }{ print $c' file
4
Run Code Online (Sandbox Code Playgroud)
sed 和 wc
$ sed -n '1d; /,[^E]/p' file | wc -l
4
Run Code Online (Sandbox Code Playgroud)