Regex 必要时使用正则表达式向csv文件添加逗号
我有一个csv文件,如下所示:Regex 必要时使用正则表达式向csv文件添加逗号,regex,vim,awk,Regex,Vim,Awk,我有一个csv文件,如下所示: entity_name,data_field_name,type Unit,id Track,id,LONG 第二行缺少逗号。我想知道是否有一些类似regex或awk的工具,以便在行尾追加逗号,以防这些行中缺少逗号 更新 我知道要求有点模糊。可能有几种替代方法来缩小需求范围,例如: 标题行应定义对整个文件有效的列数(和逗号)。脚本应该首先读取标题行并找出正确的列数 列数可以作为参数传递给脚本 列数可以硬编码到脚本中 起初,我没有缩小需求范围,因为我对其中任何一项
entity_name,data_field_name,type
Unit,id
Track,id,LONG
第二行缺少逗号。我想知道是否有一些类似regex或awk的工具,以便在行尾追加逗号,以防这些行中缺少逗号
更新
我知道要求有点模糊。可能有几种替代方法来缩小需求范围,例如:
sed 's/^[^,]*,[^,]*$/&,/' file
例如:
试试这个:
$ awk -F , 'NF==2{$2=$2","}1' file
输出:
entity_name,data_field_name,type
Unit,id,
Track,id,LONG
使用另一个
awk
:
awk -F, 'NF==2{$3=""}1' OFS=, yourfile.csv
您可以使用此awk命令,根据标题行中的列数,用空单元格值填充从第二行开始的所有行,以避免对列数进行硬编码:
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
awk'BEGIN{FS=OFS=”,“}NR==1{nc=NF}{printf”%s',$0;
对于(i=NF+1;i为所有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
这可能是您所需要的全部,取决于您在问题中没有与我们共享的信息:
$ awk -F, '{print $0 (NF<3?FS:"")}' file
entity_name,data_field_name,type
Unit,id,
Track,id,LONG
awk-F'{print$0(NFawk-F,-vOFS=,'NR==1{x=NF}NF=x'
也有同样的功能。事实上,我做过一次,但EdMorton提醒我,更改NF
的功能在所有awk版本中都是不可移植的。我目前有gnu awk,但将在几天内试用BSD awkhours@123:刚刚在OSX的awk
和awk-F上测试,-v OFS=,'NR==1{x=NF}NF=x'文件
不起作用。第二行打印为Unit,id
而不是Unit,id,
Nice,感谢您的跟进。我认为awk'开始{FS=OFS=“,”}{$3=$3}1
也应该起作用吗?你用vim标记了Q,你不知道如何在vim的第2行添加逗号?或者还有更多的要求?可以像v/,.*,/norm A,
编辑你的问题来显示你的尝试和预期的输出。是否会有两个缺少的逗号?空行?如果是,请更新你的输入以包括这些情况。@K在问题中,我说“可能会有一些类似regex或awk的工具”。在这类问题中,很常见的是,有人建议使用其他工具使用一个非常不同的解决方案。Vim是一个非常强大的工具。我想可能会有一个使用Vim的有趣解决方案。
$ awk -F, '{print $0 (NF<3?FS:"")}' file
entity_name,data_field_name,type
Unit,id,
Track,id,LONG