![剪切数组列并将另一列连接到 csv 文件](https://linux22.com/image/97047/%E5%89%AA%E5%88%87%E6%95%B0%E7%BB%84%E5%88%97%E5%B9%B6%E5%B0%86%E5%8F%A6%E4%B8%80%E5%88%97%E8%BF%9E%E6%8E%A5%E5%88%B0%20csv%20%E6%96%87%E4%BB%B6.png)
我有一个 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)