使用awk忽略CSV文件字段中的逗号

aCa*_*lla 3 linux csv awk command-line parsing

我正在尝试从 CSV 文件最后一行的第二个字段中获取一个数字。到目前为止,我有这个:

awk -F"," 'END {print $2}' /file/path/fileName.csv
Run Code Online (Sandbox Code Playgroud)

这有效,除非最后一行的第一个字段中有逗号。所以对于看起来像这样的一行,

"Company Name, LLC", 12345, Type1, SubType3
Run Code Online (Sandbox Code Playgroud)

..."Company Name, LLC"实际上是第一个字段,该awk命令将返回LLC.

如何忽略第一个字段中的逗号,以便在第二个字段中获取信息?

Ini*_*ian 6

我认为您的要求是使用FPATin的完美用例GNU Awk

页面上按原样引用,man

通常,在使用 时FSgawk将字段定义为出现在每个字段分隔符之间的记录部分。换句话说,FS定义字段不是什么,而不是字段是什么。但是,有时您确实希望通过字段的含义而不是它们的含义来定义字段。

最臭名昭著的这种情况是所谓的逗号分隔值 (CSV) 数据。如果逗号只分隔数据,就不会有问题。当其中一个字段包含嵌入的逗号时,就会出现问题。在这种情况下,大多数程序将字段嵌入双引号中。

对于此处展示的 CSV 数据,每个字段要么是“任何非逗号”,要么是“双引号、非双引号和结束双引号”。如果写成正则表达式常量(参见 Regexp),我们将有/([^,]+)|("[^"]+")/. 把它写成一个字符串需要我们转义双引号,导致:

FPAT = "([^,]+)|(\"[^\"]+\")"
Run Code Online (Sandbox Code Playgroud)

在您的输入文件上使用它,

awk 'BEGIN{FPAT = "([^,]+)|(\"[^\"]+\")"}{print $1}' file
"Company Name, LLC"
Run Code Online (Sandbox Code Playgroud)