剪切数组列并将另一列连接到 csv 文件

剪切数组列并将另一列连接到 csv 文件

我有一个 CSV 文件

input.csv

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

我需要从上面的 CSV 文件中删除数组列并获取输出:

output.csv

1,2,3,9,12
1,2,3,9,12
1,2,3,9,12

所以我尝试了

cut -d , -f4 -- complement input.csv > output.csv

但上面的命令给出了错误

分隔符必须是单个字符

我还想将 output.csv 与另一个 CSV 文件结合起来

column.csv
30
36
90

那么结果会是这样的

result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

有人可以帮助我吗?

答案1


与米勒 (http://johnkerl.org/miller/doc) 从...开始

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

非常简单,你可以运行

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv

获得

1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

cut -x -f 4删除了第四列并paste添加了 column.csv 列

答案2

为了正确处理引用的分隔符,您应该考虑使用专门设计的 CSV 解析器 - 例如,来自 perl Text::CSV 模块的解析器。例如,

paste -d, input.csv column.csv | perl -MText::CSV -ne '
  BEGIN {$csv = Text::CSV->new()}
  if ($csv->parse($_)) {
    @a = $csv->fields();
    splice(@a, 3, 1);
    print join(",", @a) . "\n";
  }'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

答案3

如果您不想使用 @steeldrive 建议的专门设计的 CSV 解析器,您可以使用awk

awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv

请注意,这仅适用于示例中提供的样式。

解释:

分割文本间隔"

{split($0,a,"\"")

,打印并删除第二列的第一列

print a[1] substr(a[3],2)

相关内容