【问题标题】:How to replace the third comma in a csv file with a space in linux using bash?如何使用 bash 将 csv 文件中的第三个逗号替换为 linux 中的空格?
【发布时间】:2017-10-20 14:29:54
【问题描述】:

我有一个表格文件,其中的列用空格分隔。我编写了以下 bash 脚本来将空格转换为逗号:

#!/bin/bash
for f in /home/foo/*; do
  i=`basename $f`
  i2=${i%.*}
  cut -f 1,2,3,4 < $f | tr -s [:blank:] ',' > $i2.csv
done

但是我错过了一些东西,我的日期时间在日期和时间之间有一个空格,现在那里有一个逗号。日期时间的逗号是第三个,有没有办法在linux中用空格替换所有行的第三个逗号?

【问题讨论】:

  • sed 's/,/ /3' 可能吗?我不确定你的输入文件到底长什么样。
  • @BenjaminW。它看起来像这样:6000,0,2012-01-01,08:00:00,9,foo,x,0.123 下一行将是相同的只是不同的数据
  • @BenjaminW。您的解决方案效果很好,如果您想将其作为解决方案发布,我会接受它作为正确答案。谢谢! :)

标签: linux bash csv


【解决方案1】:

sed s 命令有一个标志来指定将命令应用于哪个正则表达式:

sed 's/,/ /3' infile

修改每行中的第三个, 并用空格替换它。

【讨论】:

  • @αғsнιη 引自POSIX spec:“n:仅替换模式空间中发现的第 n 次出现的 BRE”所以此解决方案不起作用的任何 sed 都不符合 POSIX。我在 BSD sedmacOS sed 的手册页中看到它。
【解决方案2】:

要在您可以使用的所有 sed 实现中工作:

sed -r 's/^(([^,]*,){2}[^,]*),/\1 /' infile

【讨论】:

  • 替换特定事件的标志由 POSIX 指定。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 2011-02-26
  • 2017-12-15
  • 2013-12-10
  • 1970-01-01
  • 2014-08-03
  • 2016-12-23
相关资源
最近更新 更多