将带有SED的CSV文件转换为新的输出格式?

时间:2018-07-26 10:56:50

标签: 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

var1, var2, var3 \t "var4"
var1, var2, var3 \t "var4" "var5" "var6" "var7" "var8"
var1, var2, var3 \t "var4" "var5"

前三个变量/列用逗号分隔。然后,使用制表符将它们与其余的列/变量(由“和”隔开)分隔。

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

sed -E 's/^(([^,]+,){2})([^,]+)/\1"\3"/

以及如何用另一个(\ t)替换第三个定界符(,):

sed 's/,/\t/3' tmp.csv

但是我不确定如何将分隔符从第4个位置更改为空格并向前移动其余列。

我希望其中一些经验丰富的sed用户能够为我提供帮助。

谢谢!

干杯,比吉特

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed 's/,/\t/3;s/,//3g;s/\S\+/"&"/4g' file

将第三个,替换为一个标签。从第三个开始删除全局`,'。同样,从第四个字段开始用双引号引起来。