使用SED将csv文件转换为新的输出格式?

使用SED将csv文件转换为新的输出格式?,csv,unix,sed,command-line,Csv,Unix,Sed,Command Line,我有一个csv文件,包含900行,列从8到400不等。有没有一种方法可以将sed转换为 var1, var2, var3, var4 var1, var2, var3, var4, var5, var6, var7, var8 var1, var2, var3, var4, var5 到 其中前3个变量/列以逗号分隔。然后用一个选项卡将这些列/变量与其他列/变量(由“和空格分隔”包围)分隔开 我发现了如何在第三列周围添加引号,但我不确定如何从第三列到所有行的其余列(数字各不相同) sed -E

我有一个csv文件,包含900行,列从8到400不等。有没有一种方法可以将sed转换为

var1, var2, var3, var4
var1, var2, var3, var4, var5, var6, var7, var8
var1, var2, var3, var4, var5

其中前3个变量/列以逗号分隔。然后用一个选项卡将这些列/变量与其他列/变量(由“和空格分隔”包围)分隔开

我发现了如何在第三列周围添加引号,但我不确定如何从第三列到所有行的其余列(数字各不相同)

sed -E 's/^(([^,]+,){2})([^,]+)/\1"\3"/
以及如何将第三个分隔符(,)替换为另一个(\t):

但我不知道如何将其余列的分隔符从第4个位置改为空格和前进

我希望你们当中一些更有经验的sed用户能够帮助我

谢谢大家!


干杯,Birgitte

awk擅长处理基于列的数据

使用awk的一种方法:

awk -F', ' -v q='"' '{
    for(i=1;i<=NF;i++){
        if(i==3){$i=$i"\t";continue}
        $i=i<3?($i","):(q $i q)
    }}7' file.csv
awk-F','-vq=''{
对于(i=1;i这可能适用于您(GNU-sed):


用制表符替换第三个
。从第三个字段开始全局删除“,”。同样,从第四个字段开始用双引号将字段括起来。

谢谢,但这并不是我想要的结果-结果类似于:
var1,var2,var3\t var4var5var6var7var8
而不是
var1,var2,var3\t“var4”“var5”“var6”“var7”“var8”
在仔细研究了一下您的代码之后,我找到了以下解决方案:
sed的/[^,]*/“&”/4g;s/,//4g;s/,/\t/3'
它的工作原理是:-)s/[^,]*/“&”/4g在列(由[^,]指定)周围添加引号(&)”,从第4列开始向前(4g);s/,//4g用第4列中的空格替换逗号。;s/,//\t/3用制表符替换第3个逗号。@biogite使用您提供的示例数据,您的解决方案在第一个双引号后面引入空格,即
[^,]
还将包含空格。啊,是的,我现在可以看到了!感谢您通知我此消息谢谢,但由于某些原因,代码对csv文件没有影响(即没有更改)@Biogette将它输出到标准输出。如果您想进行适当的更改:
awk'.'file.csv>tmp.csv&&mv tmp.csv文件.csv
谢谢,但新文件似乎也没有更改。我将它与sed一起使用,例如:`sed's/[^,]*/“&/4g;s/,//\t/3。感谢您的帮助:)解决方案:
sed's/[^,]*//-/4g;s/,//\t/3'>
sed 's/,/\t/3' tmp.csv
awk -F', ' -v q='"' '{
    for(i=1;i<=NF;i++){
        if(i==3){$i=$i"\t";continue}
        $i=i<3?($i","):(q $i q)
    }}7' file.csv
sed 's/,/\t/3;s/,//3g;s/\S\+/"&"/4g' file