awk字段分隔符,当分隔符出现在双引号中时

3

我正在尝试使用awk来读取某些输入,其中字段位置在第3个位置、$3,第3个字段是一个字符串。

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

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

field1,field2,field3,field4,field5

问题在于这些字段由逗号分隔,有些是双引号括起来的,有些则不是。而第五个字段是用双引号括起来的,并包含各种类型的符号。例如:
imfield1,imfield2,"imfield3",imfield4,"im"",""fi"",el,""d5"

awk能够处理这种情况吗?更具体地说,如何通过输入$5获取整个字符串?

3个回答

3

您可以使用Lorance Stinson 的 Awk CSV 解析器,在这种情况下,操作非常简单:

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

0

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

#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

0

问题中的第二个示例确实在最后一个字段内有逗号。实际内容(引号已处理)为:"im","fi",el,"d5" - Ingmar Hupp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接