Bash 填充csv的列

Bash 填充csv的列,bash,awk,command-line,Bash,Awk,Command Line,我有一个csv文件,其中包含大量csv分离的数据行。我想找到行的最大长度,然后需要在新列中打印NO file.csv 1,2,3,4, 1,4,7,8,9,10,11,13 1,2, 1,1,2,4,5,6,7,8,9,10,11 abc,def,ghi,jkl 预期结果 1,2,3,4,,,,,,,,,,,,,,,,N0 1,4,7,8,9,10,11,13,,,,,NO 1,2,,,,,,,,,,,,,,,,,,,,NO 1,1,2,4,5,6,7,8,9,10,1,NO abc,def,

我有一个csv文件,其中包含大量csv分离的数据行。我想找到行的最大长度,然后需要在新列中打印NO

file.csv

1,2,3,4,
1,4,7,8,9,10,11,13
1,2,
1,1,2,4,5,6,7,8,9,10,11
abc,def,ghi,jkl
预期结果

1,2,3,4,,,,,,,,,,,,,,,,N0
1,4,7,8,9,10,11,13,,,,,NO
1,2,,,,,,,,,,,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,1,NO
abc,def,ghi,jkl,,,,,,,,NO
获得的产出

1,2,3,4,NO
1,4,7,8,9,10,11,13,NO
1,2,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,NO
如果行必须具有相同的大小:

awk -F, 'BEGIN{m=0}
{if(length($0)>m)m=length($0);ar[NR]=$0;ars[NR]=length($0);}
END{for(i=1;i<=NR;i++)
       {for(j=ars[i];j<m;j++)
           {ar[i]=ar[i]","}ar[i]=ar[i]"NO";
                           print ar[i]}}' <<<'1,2,3,4,
1,4,7,8,9,10,11,13
1,2,
1,1,2,4,5,6,7,8,9,10,11,12
abc,def,ghi,jkl
a,b'

如果要在最大长度线后加逗号,则循环运行到m+1

您需要读取文件两次,一次获取最大列数,一次打印输出:

awk -F, 'NR==FNR{if(m<=NF)m=NF;next} # Runs only on first iteration
         {printf "%s",$0;for(i=0;i<=(m-NF);i++)printf ",";print "NO"}' file file

                                                      filename twice -----^

很难想象为什么要用逗号填充行,因此我认为您真正想要的是使每行具有相同数量的字段:

$ awk 'BEGIN{FS=OFS=","} NR==FNR{m=(m>NF?m:NF);next} {$(m+1)="NO"} 1' file file
1,2,3,4,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,NO
1,2,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,,,,,,,,NO
下面是你说的你想要的:

$ awk '{n=length()} NR==FNR{m=(m>n?m:n);next} {p=sprintf("%*s",m-n+1,""); gsub(/ /,",",p); $0=$0 p "NO"} 1' file file
1,2,3,4,,,,,,,,,,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,,,NO
1,2,,,,,,,,,,,,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,,,,,,,,,NO

每一行是用
填充还是每一行的列数相同?您声称从
cat file | cat>file.csv;echo NO>>file.csv
令人惊讶。你必须有魔法版的
cat
echo
,可以猜出你的愿望。
1,2,3,4,,,,,,,,,,,,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,,,,,NO
1,2,,,,,,,,,,,,,,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,12NO
abc,def,ghi,jkl,,,,,,,,,,,NO
a,b,,,,,,,,,,,,,,,,,,,,,,,NO
awk -F, 'NR==FNR{if(m<=NF)m=NF;next} # Runs only on first iteration
         {printf "%s",$0;for(i=0;i<=(m-NF);i++)printf ",";print "NO"}' file file

                                                      filename twice -----^
1,2,3,4,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,NO
1,2,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,,,,,,,,NO
$ awk 'BEGIN{FS=OFS=","} NR==FNR{m=(m>NF?m:NF);next} {$(m+1)="NO"} 1' file file
1,2,3,4,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,NO
1,2,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,,,,,,,,NO
$ awk '{n=length()} NR==FNR{m=(m>n?m:n);next} {p=sprintf("%*s",m-n+1,""); gsub(/ /,",",p); $0=$0 p "NO"} 1' file file
1,2,3,4,,,,,,,,,,,,,,,,,NO
1,4,7,8,9,10,11,13,,,,,,NO
1,2,,,,,,,,,,,,,,,,,,,,,NO
1,1,2,4,5,6,7,8,9,10,11,NO
abc,def,ghi,jkl,,,,,,,,,NO