添加结尾逗号以确保.csv行具有相同的列数

时间:2019-01-25 10:52:12

标签: bash macos csv unix awk

我有一个逗号分隔的文件,其中行的列数不均匀。

我想添加尾随逗号(具有空值),以便每列具有最大列数。

我目前有:

i1, 12, 15
i2, 00, 01
i3
i4, 18, 21, 36

这只是一个示例,实际文件的最大列数有所不同。

对于上述示例,我期望的输出是:

i1, 12, 15,  
i2, 00, 01,  
i3,   ,   ,  
i4, 18, 21, 36

提前谢谢!

4 个答案:

答案 0 :(得分:2)

您可以使用awk来完成这项工作:

$ awk 'BEGIN{FS=OFS=", "}NF<=3{for(i=NF+1;i<=4;i++)$i="  "}7' file
i1, 12, 15,
i2, 00, 01,
i3,   ,   ,
i4, 18, 21, 36

请注意,在第1行和第2行中,如果有关系,有两个尾随空格,您可以添加sub(/ *$/,"")

答案 1 :(得分:1)

一个用于GNU awk。它将文件处理两次。在第一次运行时,它确定最大字段数,在第二次运行中,它在末尾添加“空”(好,两个空格)字段:

$ awk '
BEGIN {
    FS=OFS=", "            # field separators
}
NR==FNR {                  # first run
    if(maxnf<NF)           # find the biggest NF
        maxnf=NF
    next
}
NF<maxnf {
    nf=NF+1                # store NF+1 for for
    NF=maxnf               # reset the NF
    for(nf;nf<=NF;nf++)    # process the new fields
        $nf="  "
}1' file file              # output records

输出:

i1, 12, 15,   
i2, 00, 01,   
i3,   ,   ,   
i4, 18, 21, 36

答案 2 :(得分:1)

使用Miller(http://johnkerl.org/miller/doc

mlr --nidx --fs ',' --repifs  unsparsify --fill-with "" inputFile

你有

i1, 12, 15,
i2, 00, 01,
i3,,,
i4, 18, 21, 36

答案 3 :(得分:1)

如果输出行的顺序无关紧要,则与sort一起另一个awk

$ awk -F"," ' {print NF "," $0 } ' tane.txt  | sort -k1 -nr | awk -F, ' { if(NR==1) mx=NF;for(i=2;i<mx;i++) {$i=length($i)?$i:" "; printf "%s,", $i} print $i } '
i4, 18, 21, 36
i2, 00, 01,
i1, 12, 15,
i3, , ,

$

输入文件

$ cat tane.txt
i1, 12, 15
i2, 00, 01
i3
i4, 18, 21, 36

$