我有一个 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)