Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk解析CSV文件时,为什么会忽略空单元格?_Bash_Csv_Awk - Fatal编程技术网

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列是空的

  • 为什么
    awk
    跳过第4列
  • 如何使
    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。或者甚至在开头和结尾有一个额外的空字段。毕竟,正则表达式在字符串中的每个位置都匹配。