使用awk解析CSV文件时,为什么忽略空单元格?

Vil*_*age 2 csv bash awk

我有一些awk用于解析CSV文件的脚本.我注意到,如果一个单元格为空,awk只需移动到下一个单元格.这意味着,如果我要求它读取第4列,但该单元格为空,则会打印第5列的数据,例如:

echo "1@2@3@@5" | awk -F "@*" '{print $4}'
Run Code Online (Sandbox Code Playgroud)

我的预期结果是它什么都不打印,因为第4列是空的.

  • 为什么要awk跳过第4列?
  • 我怎样才能awk不忽略空列?

Sha*_*hin 8

问题不是你的想法.awk并没有忽略空单元格; 它将该行解析为4个字段而不是5个字段.

[me@home]$ echo "1@2@3@@5" | awk -F "@*" '{print NF}'
4
Run Code Online (Sandbox Code Playgroud)

这是监守你使用@*作为你的字段分隔符,它允许一个或多个连续@作为字段分隔符(@,@@,@@@,...都是有效的字段分隔符).

请尝试使用-F "@".

[me@home]$ echo "1@2@3@@5" | awk -F "@" '{print NF}'
5
[me@home]$ echo "1@2@3@@5" | awk -F "@" '{print $4}'

[me@home]$ echo "1@2@3@@5" | awk -F "@" '{print $5}'
5
Run Code Online (Sandbox Code Playgroud)

  • `awk`实际上是善良的,并且忽略了正则表达式的空匹配.因为正则表达式是可空的(匹配空字符串),严格来说,输入行"1234 @@ 5"实际上应该分成字段1,2,3,4,5.或者甚至可能在开头有一个额外的空字段并结束.毕竟,正则表达式匹配字符串中的每个位置. (2认同)