Awk 在每行末尾添加分隔符

Awk 在每行末尾添加分隔符,awk,sed,Awk,Sed,我有一个csv文件,如下所示 id,id1,id2,id3,id4,id5 1,101,102,103,104 2,201,202,203 3,301,302 现在,我想在每一行中添加逗号(,),以使所有行具有相同数量的分隔符。所以期望的输出应该是 id,id1,id2,id3,id4,id5 1,101,102,103,104, 2,201,202,203,, 3,301,302,,, 使用 awk -F "," ' { print NF-1 } ' file.csv | sort -r

我有一个csv文件,如下所示

id,id1,id2,id3,id4,id5
1,101,102,103,104
2,201,202,203
3,301,302
现在,我想在每一行中添加逗号(,),以使所有行具有相同数量的分隔符。所以期望的输出应该是

id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,
使用

awk -F "," ' { print NF-1 } ' file.csv | sort -r | head -1

我能够找到分隔符的最大出现次数,但不确定如何比较每一行并在其小于最大值时添加逗号。

您已经在使用变量
NF
,该变量指示一行上有多少字段

awk -F , 'NF<6 { OFS=FS; for (i=NF+1; i<=6; i++) $i="" }1' filename

awk-F,'NFUnified
awk
方法(基于第一行标题的字段数):

输出:

id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,

或通过环路:

awk -F',' 'NR==1{ max_nf=NF; print }
           NR>1{ n=max_nf-NF; r=""; while (n--) r=r","; print $0 r }' file

以下
awk
也可能对您有所帮助

awk -F, '
FNR==1{
  val=NF;
  print;
  next
}
{
  count=NF;
  while(count<val){
    value=value",";
    count++};
  print $0 value;
  value=count=""
}
'   Input_file
使用
GNU awk
(因为我不知道这是否适用于其他实现)

如果第一行确定所需的字段数:

$ awk -F, -v OFS=',' 'NR==1{f=NF} {NF=f} 1' ip.txt
id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,
如果任何一行确定最大字段:

$ cat ip.txt 
id,id1,id2
1,101,102,103
2,201,202,203,204
3,301,302

$ awk -F, -v OFS=',' 'NR==FNR{f=(!f || NF>f) ? NF : f; next} {NF=f} 1' ip.txt ip.txt
id,id1,id2,,
1,101,102,103,
2,201,202,203,204
3,301,302,,

这可能比我的更有效,因为您没有重写任何字段,但可能有点晦涩。也许可以解释一下
printf
宽度说明符是如何决定实际打印多少个逗号的?同样,对于一个完全广义的解决方案,九个逗号的固定序列是不够的。
awk -F, '
FNR==1{
  val=NF;
  print;
  next
}
{
  count=NF;
  while(count<val){
    value=value",";
    count++};
  print $0 value;
  value=count=""
}
'   Input_file
id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,
$ # simply assign value to NF
$ awk -F, -v OFS=',' '{NF=6} 1' ip.txt
id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,
$ awk -F, -v OFS=',' 'NR==1{f=NF} {NF=f} 1' ip.txt
id,id1,id2,id3,id4,id5
1,101,102,103,104,
2,201,202,203,,
3,301,302,,,
$ cat ip.txt 
id,id1,id2
1,101,102,103
2,201,202,203,204
3,301,302

$ awk -F, -v OFS=',' 'NR==FNR{f=(!f || NF>f) ? NF : f; next} {NF=f} 1' ip.txt ip.txt
id,id1,id2,,
1,101,102,103,
2,201,202,203,204
3,301,302,,