Unix awk字段分隔符,当分隔符显示在双引号中时

Unix awk字段分隔符,当分隔符显示在双引号中时,unix,awk,field,delimiter,Unix,Awk,Field,Delimiter,我试图使用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能处理这样的

我试图使用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获得整个字符串?

分隔符是一个简单的逗号,而不是引号之间的逗号。如果字段不包含逗号,则awk可能会启动该任务:

awk -F , '
  {
    if ($3 ~ /^".*"$/) {
        $3 = substr($3, 2, length($3)-2);
        gsub(/""/, "", $3);
     }
     print $3;
  }' input.txt
这已经变得相当复杂了。如果字段中可能有逗号,请使用适当的CSV解析器,例如在Perl或Python中。请参见您可以使用的,在这种情况下,它非常简单:

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'导入csv,sys;[sys.stdout.write(行[2]+“\n”)用于csv.reader(sys.stdin)中的行]
您可以在
awk
设置空字段分隔符中解析该行。当
inda==0时,您可以将
$i
分配给var并打印出来,而不是
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
\echo“\“AAA,BBB\”,“CCC\”,“DDD,EEE,FFF\”>uno
awk'开始{FS=”“}
{

对于(i=1;问题中的第二个示例在最后一个字段中有逗号。实际内容(已处理引号)为:
im”、“fi”、el、“d5
#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