Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 必要时使用正则表达式向csv文件添加逗号_Regex_Vim_Awk - Fatal编程技术网

Regex 必要时使用正则表达式向csv文件添加逗号

Regex 必要时使用正则表达式向csv文件添加逗号,regex,vim,awk,Regex,Vim,Awk,我有一个csv文件,如下所示: entity_name,data_field_name,type Unit,id Track,id,LONG 第二行缺少逗号。我想知道是否有一些类似regex或awk的工具,以便在行尾追加逗号,以防这些行中缺少逗号 更新 我知道要求有点模糊。可能有几种替代方法来缩小需求范围,例如: 标题行应定义对整个文件有效的列数(和逗号)。脚本应该首先读取标题行并找出正确的列数 列数可以作为参数传递给脚本 列数可以硬编码到脚本中 起初,我没有缩小需求范围,因为我对其中任何一项

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

entity_name,data_field_name,type
Unit,id
Track,id,LONG
第二行缺少逗号。我想知道是否有一些类似regex或awk的工具,以便在行尾追加逗号,以防这些行中缺少逗号

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

  • 标题行应定义对整个文件有效的列数(和逗号)。脚本应该首先读取标题行并找出正确的列数
  • 列数可以作为参数传递给脚本
  • 列数可以硬编码到脚本中 起初,我没有缩小需求范围,因为我对其中任何一项都没有意见。当然,第一种选择是最好的,但我不确定这是否容易实现

    谢谢你的回答和评论。下次,我将明确说明可接受的替代要求

    我会使用sed

    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(NF
    awk-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