awk字段分隔符,当分隔符以双引号显示时

时间:2012-09-06 19:34:41

标签: 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处理这样的情况吗? 更多的是,我如何通过典型的5美元获得整个字符串?

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:0)

分隔符是一个简单的逗号,而不是引号之间的逗号。如果字段不包含逗号,那么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

答案 2 :(得分: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

{{1}}