我有一个类似以下的csv文件:
entity_name,data_field_name,type
Unit,id
Track,id,LONG
第二行缺少逗号。我想知道是否可能有一些正则表达式或类似awk的工具,以便在这些行中缺少逗号的情况下将逗号附加到行尾?
我知道要求有点模糊。可能有几种替代方法来缩小要求,例如:
我一开始并没有缩小要求,因为我对其中任何一个都没问题。当然,第一种选择是最好的,但我不确定这是否易于实现。
感谢所有出色的答案和评论。下次,我将明确说明可接受的替代要求。
答案 0 :(得分:3)
您可以使用此awk命令从第2行开始填充所有行,并使用基于标题行中列数的空单元格值,以避免硬编码列数:
awk 'BEGIN{FS=OFS=","} NR==1{nc=NF} NF{$nc=$nc} 1' file
entity_name,data_field_name,type
Unit,id,
Track,id,LONG
早期的解决方案:
awk 'BEGIN{FS=OFS=","} NR==1{nc=NF} {printf "%s", $0;
for (i=NF+1; i<=nc; i++) printf "%s", OFS; print ""}' file
答案 1 :(得分:1)
我会用sed,
sed 's/^[^,]*,[^,]*$/&,/' file
示例:的
$ echo 'Unit,id' | sed 's/^[^,]*,[^,]*$/&,/'
Unit,id,
$ echo 'Unit,id,bar' | sed 's/^[^,]*,[^,]*$/&,/'
Unit,id,bar
答案 2 :(得分:1)
试试这个:
$ awk -F , 'NF==2{$2=$2","}1' file
<强>输出:强>
entity_name,data_field_name,type
Unit,id,
Track,id,LONG
答案 3 :(得分:1)
使用另一个awk
:
awk -F, 'NF==2{$3=""}1' OFS=, yourfile.csv
答案 4 :(得分:1)
为所有awk解决方案提供平衡,以下可能是仅限vim的解决方案
:v/,.*,/norm A,
理
/,.*,/ searches for 2 comma's in a line
:v apply a global command on each line NOT matching the search
norm A, enters normal mode and appends a , to the end of the line
答案 5 :(得分:1)
这可能是您所需要的,具体取决于您在问题中未与我们分享的信息:
$ awk -F, '{print $0 (NF<3?FS:"")}' file
entity_name,data_field_name,type
Unit,id,
Track,id,LONG