【问题标题】:awk field separator , when the separator shows up in double quoteawk 字段分隔符,当分隔符出现在双引号中时
【发布时间】:2012-09-06 19:34:40
【问题描述】:

我正在尝试使用 awk 在字段位置 3 处读取一些输入,$3,字段 3 是一个字符串

awk -F'","' '{print $1}'  input.txt

我的文件 input.txt 看起来像这样

field1,field2,field3,field4,field5

问题是这些字段用逗号分隔,其中一些是双引号,而另一些则不是。字段 5 是双引号,包含各种类型的符号。示例:

imfield1,imfield2,"imfield3",imfield4,"im"",""fi"",el,""d5"

awk 可以处理这样的情况吗? 更详细地说,如何通过键入 $5 来获取整个字符串?

【问题讨论】:

    标签: unix awk field delimiter


    【解决方案1】:

    您可以使用Lorance Stinson's Awk CSV parser,在这种情况下,它很简单:

    function parse_csv(..) {
        ..
    }
    
    {
        num_fields = parse_csv($0, csv, ",", "\"", "\"", "\\n", 1);
        print csv[2]
    }
    

    如果您不喜欢 Awk,那么 Python 还提供了一个不错的 CSV 解析器:

    import csv, sys
    
    for row in csv.reader(sys.stdin):
        print row[2]
    

    或者从命令行(一行有点棘手):

    python -c 'import csv,sys;[sys.stdout.write(row[2]+"\n") for row in csv.reader(sys.stdin)]' < input.txt
    

    【讨论】:

      【解决方案2】:

      分隔符是一个简单的逗号,而不是引号之间的逗号。如果字段不包含逗号,那么 awk 可能会胜任这项任务:

      awk -F , '
        {
          if ($3 ~ /^".*"$/) {
              $3 = substr($3, 2, length($3)-2);
              gsub(/""/, "", $3);
           }
           print $3;
        }' input.txt
      

      这已经变得相当复杂了。如果字段内可以有逗号,请使用适当的 CSV 解析器,例如在 Perl 或 Python 中。见https://unix.stackexchange.com/questions/7425/is-there-a-robust-command-line-tool-for-processing-csv-files

      【讨论】:

      • 问题中的第二个示例在最后一个字段中确实有逗号。实际内容(已处理引号)为:im","fi",el,"d5
      【解决方案3】:

      您可以在awk 中设置空字段分隔符来解析行。您可以将 $i 分配给 var 并在 inda==0 时打印出来,而不是 printf("%s",$i)

      #echo "\"AAA,BBB\",\"CCC\",\"DDD, EEE, FFF\"" > uno
      
      awk 'BEGIN { FS="" }
      {
          for ( i=1; i<NF; i++) {
              if ( $i == "\"" )
                  if ( inda == 0 ) 
                      inda = 1
                  else
                      inda = 0
              if ( $i == "," )
                  if ( inda == 0 )
                      $i="|"
              printf("%s",$i)
          }
          printf("\n")
      }' uno
      

      【讨论】:

        猜你喜欢
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        相关资源
        最近更新 更多