从 CSV 文件中提取数据,其中某些字段的字段值中有逗号

从 CSV 文件中提取数据,其中某些字段的字段值中有逗号

如何解析 CSV 文件

文件名:abc.csv(csv文件)上述文件包含如下数据

abv,sfs,,hju,',',jkk
wff,fst,,rgr,',',rgr
ere,edf,erg,',',rgr,rgr

我有一个要求,比如我必须提取不同的字段并将它们分配给不同的变量。

我的代码:

 cat $file | awk 'NR!=1' | while read -r line
  do
     a=`echo "$line" | awk -F',' '{print $1}'`
     b=`echo "$line" | awk -F',' '{print $2}'`
     c=`echo "$line" | awk -F',' '{print $3}'`
     d=`echo "$line" | awk -F',' '{print $4}'`
     e=`echo "$line" | awk -F',' '{print $5}'`
     f=`echo "$line" | awk -F',' '{print $6}'`
     echo "$e"
     echo "$f"
done

输出:(它以单引号形式给出输出)

'
'
'
'
'
'

所需的输出应该是这样的:(我的第五个字段的值为“逗号”)

   ,
   jkk
   ,
   rgr
   ,
   rgr
   rgr

答案1

使用cvscut来自csvkit工具箱:

$ csvcut -q "'" -c 5,6 file.csv
",",jkk
",",rgr
rgr,rgr

需要-q "'"告诉csvcut数据中使用了非标准引用字符(单引号)。提取-c 5,6第五列和第六列。输出将是格式正确的 CSV 文档。

要仅获取第五列,不添加引号:

$ csvcut -q "'" -c 5 file.csv | csvformat -T
,
,
rgr

csvcut这会传递through的输出csvformat,并要求它使用制表符而不是逗号作为输出分隔符。由于数据中没有制表符,因此不再需要引用数据。

这显然也适用于以制表符分隔格式获取多列:

$ csvcut -q "'" -c 5,6 file.csv | csvformat -T
,       jkk
,       rgr
rgr     rgr

它还适用于将所有逗号分隔的数据转换为制表符分隔的数据:

$ csvformat -q "'" -T file.csv
abv     sfs             hju     ,       jkk
wff     fst             rgr     ,       rgr
ere     edf     erg     ,       rgr     rgr

使用制表符分隔的数据可以更轻松地使用标准 Unix 工具对其进行处理:

$ csvformat -q "'" -T file.csv | cut -f 5,6
,        jkk
,       rgr
rgr     rgr

以下重现了您的预期输出:

$ csvformat -q "'" -T file.csv | awk -F '\t' '{ print $5; print $6 }'
,
jkk
,
rgr
rgr
rgr

(请注意,问题中的预期输出有一个意外的逗号,我假设它来自列在最后一行。它不应该在那里。)


对于更高级的解析,请考虑其他脚本语言,例如 Python 或 Perl。

Perl 中的模块Text::CVS可以轻松访问 CSV 数据。下面只是表明在 Perl 中将完整文件读入数组的数组相当容易:

$ perl -MData::Dumper -MText::CSV=csv -e '$c = csv(in=>"file.csv",quote_char=>"\x27");print Dumper($c)'
$VAR1 = [
          [
            'abv',
            'sfs',
            '',
            'hju',
            ',',
            'jkk'
          ],
          [
            'wff',
            'fst',
            '',
            'rgr',
            ',',
            'rgr'
          ],
          [
            'ere',
            'edf',
            'erg',
            ',',
            'rgr',
            'rgr'
          ]
        ];

答案2

与米勒

<input sed "s/'/\"/g"  | mlr --c2x --implicit-csv-header cut -f 5,6 | \
grep -v "^$" | cut  -d " " -f 2

给你

,
jkk
,
rgr
rgr
rgr

它不是 awk,它是 Miller 的一个很棒的结构化文本工具(http://johnkerl.org/miller/doc/)。

相关内容