更改字段名称并编辑csv文件

时间:2016-02-11 23:35:41

标签: bash csv sed

我有一个csv文件,我在bash中看到我试图操纵。我有/我正在尝试编辑的几件事。结构就是这样,第一行是列(字段)标题

cat,dog,hippopotamus,zebra
1,,3,2
three species, five species,only one,multiple
at,home, at, home, wild, wild
  1. 如何编辑csv中的字段(列)名称?

    head -1 test.csv
    

    显示了字段(列)的名称,但它中仍然包含逗号,并且根本不允许更改字段名称。

    关于这一点的另一部分是我只想编辑长度超过8个字符的标题,在这种情况下,我将只取前8个字符。我猜测我会根据字符串长度使用某种循环,但由于我不知道如何编辑一列的字段名称,我不知道该怎么做。在上面的方案中,将hippopotamus更改为hippopot

  2. 如何将csv中的空单元格替换为NANULL

    sed -i 's/ /NULL/g'
    

    思想会起作用,但不会。

  3. 其中一些单元格中包含逗号,弄乱了,分隔符。我使用下面的代码,它似乎工作,但有更好/更安全的方法来做到这一点?

    sed -i "s/, /_/g"
    
  4. 或者在类似情况下,如果多列包含有时在字符串中包含空格的字符串但我只想删除其中一列中的空格而只留下其他列,我该如何实现?

    sed -i 's/ //g' test.csv 
    

1 个答案:

答案 0 :(得分:0)

  1. Sed将允许行号作为命令前缀,仅适用于单行(或一系列数字,以处理该范围内的行)。尝试这样的事情。

    sed -e '1s/cat/Feline/' test.csv > test2.csv
    
  2. CSV文件会将空字段存储为行首的逗号,行尾的逗号或逗号后跟另一个逗号:

    Field1,Field2,Field3
    ,"<-- empty field1",field3
    field1,,"<-- empty field2"
    field1,"empty field3-->",
    

    您可以使用以下sed命令来解决这些问题:

    sed -e 's/^,/NA,/;s/,$/,NA/' -e ':loop' -e 's/,,/,NA,/g;tloop' test.csv
    
  3. 您的解决方案似乎很好。但请注意,CSV应该在包含逗号的任何字符串周围加引号。这是合法的。这也是sed不再成为操纵CSV文件的好工具的重点。 ;-)一个建议是用“%2C”替换“内部”逗号,这是逗号的HTML编码。这很有特色,至少有些标准。

  4. sed从最左边的paren开始编号。如果您的组匹配多次,则只能获取最后一个匹配内容,但如果外部组包含多个匹配,则外部组仍然有效。 (我在这里假设你已经用其他东西替换了“内部”逗号。)

    sed -e ':loop' -e '^\(\([^,]*,\)\{3\}\)\([^ ,]*\) /\1\3/;tloop'
    

    这将删除第4列中的第一个空格,然后循环。它会在找到结束列或行尾的逗号时停止。

    请注意,名为\1的第一部分是通用的。您可以用任何字段替换3,减去1,这将使您到达字段的开头。实际工作在第二部分\3,你可以做你喜欢的事情。 (请注意,\2中包含\1,并不是特别有用。)