Bash 使用awk解析CSV文件时,为什么会忽略空单元格?
我有一些脚本使用Bash 使用awk解析CSV文件时,为什么会忽略空单元格?,bash,csv,awk,Bash,Csv,Awk,我有一些脚本使用awk解析CSV文件。我注意到,如果一个单元格为空,awk只会移动到下一个单元格。这意味着,如果我要求它读取第4列,但该单元格为空,它将打印第5列的数据,例如: echo "1@2@3@@5" | awk -F "@*" '{print $4}' 我的预期结果是它不会打印任何内容,因为第4列是空的 为什么awk跳过第4列 如何使awk不忽略空列 问题不在于你怎么想。awk并没有忽略空单元格;它将该行解析为4个字段,而不是5个字段 [me@home]$ echo "1@2@3@
awk
解析CSV文件。我注意到,如果一个单元格为空,awk
只会移动到下一个单元格。这意味着,如果我要求它读取第4列,但该单元格为空,它将打印第5列的数据,例如:
echo "1@2@3@@5" | awk -F "@*" '{print $4}'
我的预期结果是它不会打印任何内容,因为第4列是空的
- 为什么
跳过第4列awk
- 如何使
不忽略空列awk
- 问题不在于你怎么想。awk并没有忽略空单元格;它将该行解析为4个字段,而不是5个字段
[me@home]$ echo "1@2@3@@5" | awk -F "@*" '{print NF}'
4
这是因为您正在使用@*
作为字段分隔符,允许一个或多个连续的@
作为字段分隔符(@
,@
,@@@
,…都是有效的字段分隔符)
尝试改用-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
awk
实际上在这里很友好,忽略了正则表达式的空匹配项。因为正则表达式是可空的(匹配空字符串),所以严格来说,输入行“1234@@5”实际上应该拆分为字段1、2、3、4、5。或者甚至在开头和结尾有一个额外的空字段。毕竟,正则表达式在字符串中的每个位置都匹配。