【问题标题】:How to add a space after a comma if it does not exist within the 6th column in a csv file?如果 csv 文件的第 6 列中不存在逗号,如何在逗号后添加空格?
【发布时间】:2019-02-14 07:42:16
【问题描述】:

Ubuntu 16.04
重击 4.3.3

如果第 6 列中不存在逗号,我还需要一种在逗号后添加空格的方法。我不得不评论上面的行,因为它在 csv 文件中的所有逗号之后放置了一个空格。

错误: "This is 6th column,Hey guys,Red White & Blue,I know it,Right On"

完美: "This is 6th column, Hey guys, Red White & Blue, I know it, Right On"

我几乎可以看到 awk 打印出第 6 列,然后让 sed 完成剩下的工作:

awk '{ print $6 }' "$feed " | sed -i 's/|/,/g; s/,/, /g; s/,\s\+/, /g'

这是我目前所拥有的:

for feed in *; do
   sed -r -i 's/([^,]{0,10})[^,]*/\1/5' "$feed"
   sed -i '
      s/<b>//g; s/*//g;
      s/\([0-9]\)""/\1inch/g;
#     s/|/,/g; s/,/, /g; s/,\s\+/, /g;
      s/"one","drive"/"onetext","drive"/;
      s/"comments"/"description"/;
      s/"features"/"optiontext"/;
    ' "$feed"
done

s/|/,/g; s/,/, /g; s/,\s\+/, /g; 有效,但它是全局的,不在列中。

【问题讨论】:

  • 如果逗号不存在,您想在逗号后添加一个空格吗?逗号必须存在才能在其后添加空格。输入文件是什么样子的?它是如何分开的?按空格,那么awk可以解析吗?什么是预期的输出? @edit och 我明白了,您想在逗号后添加一个空格,但该空格不存在,对不起。
  • 为什么不awk '{ print $6 }' "$feed " | sed 's/, */, /g'| 在做什么?还有所有其他的替代品吗?

标签: bash awk sed


【解决方案1】:

听起来您只需要这个(使用 GNU awk 进行 FPAT):

awk 'BEGIN{FPAT="[^,]*|\"[^\"]+\""; OFS=","} {gsub(/, ?/,", ",$6)} 1'

例如:

$ cat file
1,2,3,4,5,"This is 6th column,Hey guys,Red White & Blue,I know it,Right On",7,8

$ awk 'BEGIN{FPAT="[^,]*|\"[^\"]+\""; OFS=","} {gsub(/, ?/,", ",$6)} 1' file
1,2,3,4,5,"This is 6th column, Hey guys, Red White & Blue, I know it, Right On",7,8

实际上,您的整个 shell 脚本(包括对 GNU sed 的多次调用)只需一次调用 GNU awk 就可以更有效地完成,而无需周围的 shell 循环,例如(未经测试):

awk -i inplace '
BEGIN{FPAT="[^,]*|\"[^\"]+\""; OFS=","} 
{
    $0 = gensub(/([^,]{0,10})[^,]*/,"\\1",5)
    $0 = gensub(/([0-9])""/,"\\1inch","g")
    sub(/"one","drive"/,"\"onetext\",\"drive\"")
    sub(/"comments"/,"\"description\"")
    sub(/"features"/,"\"optiontext\"")
    gsub(/, ?/,", ",$6)
}
' *

【讨论】:

  • 但是,如果输入包含空白字段FPAT 会失败吗?
  • @oguzismail。不可以。FPAT 的第一部分允许空字段。
  • @ed,这很适合你所拥有的。我明天去实现它。
【解决方案2】:

这可能对你有用(GNU sed):

sed -r 's/[^,"]*("[^"]*")*/\n&\n/6;h;s/, ?/, /g;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file

用换行符包围第 6 个字段。复制该行。用逗号后跟空格替换所有逗号后跟可能的空格。追加原始行并使用模式匹配替换修改后的字段,丢弃改进后的行的其余部分。

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 2017-03-18
    • 2016-01-28
    • 2011-09-08
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多