awk - 整列中的计数模式

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)

Adm*_*Bee 6

您的awk命令有几个问题。

  • 您尚未指定字段分隔符,因此awk在空格处拆分行,而不是,. 您可以使用-F','命令行选项来设置字段分隔符。
  • 你的正则表达式规定/^E_/,因此将寻求不以启动域E_(其中的第2列的值没有做),只是那些不下手E。删除_.
  • 您的命令也会计算标题行。您可以使用FNR内部变量(自动设置为当前文件中的当前行号)来排除第一行。
  • 正如 Rakesh Sharma 所指出的,如果所有行都以 开头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)


ter*_*don 5

其他一些方法: