3

我正在尝试使用 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 来获取整个字符串?

4

3 回答 3

3

您可以使用Lorance Stinson 的 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
于 2012-09-06T20:03:29.120 回答
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

于 2012-09-06T19:55:51.863 回答
0

awk您可以在设置空字段分隔符时解析该行。而不是printf("%s",$i)你可以分配$i给一个 var 并在什么时候打印出来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
于 2013-04-16T15:16:25.823 回答