【问题标题】:Change field name and edit a csv file更改字段名称并编辑 csv 文件
【发布时间】:2016-02-11 23:35:40
【问题描述】:

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

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 
    

【问题讨论】:

  • 如果字段名中包含逗号,如何确定属于哪个字段?字段没有引用吗?否则,这不是正确的“逗号分隔”。
  • 你想做的一切在 awk 中绝对是微不足道的,并且已经在这个网站和其他网站上解决了一千次,只需谷歌它。话虽如此 - 您发布的示例输入没有意义,请参阅@BenjaminW 的评论。

标签: bash csv sed


【解决方案1】:
  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 数字组从最左边的括号开始。如果你的组匹配多次,你只能得到最后一次匹配的内容,但如果外组包含多次匹配,外组仍然有效。 (我在这里假设您已经用其他东西替换了“内部”逗号。)

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

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

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

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多