必要时使用正则表达式

时间:2016-04-27 06:48:23

标签: regex vim awk

我有一个类似以下的csv文件:

entity_name,data_field_name,type
Unit,id
Track,id,LONG

第二行缺少逗号。我想知道是否可能有一些正则表达式或类似awk的工具,以便在这些行中缺少逗号的情况下将逗号附加到行尾?

更新

我知道要求有点模糊。可能有几种替代方法来缩小要求,例如:

  1. 标题行应定义对整个文件有效的列数(和逗号)。该脚本应首先读取标题行并找出正确的列数。
  2. 列数可以作为参数传递给脚本。
  3. 列数可以硬编码到脚本中。
  4. 我一开始并没有缩小要求,因为我对其中任何一个都没问题。当然,第一种选择是最好的,但我不确定这是否易于实现。

    感谢所有出色的答案和评论。下次,我将明确说明可接受的替代要求。

6 个答案:

答案 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