我们如何使用sed从特定列中删除逗号

时间:2017-05-01 07:24:09

标签: bash shell unix awk sed

PSQL表值为

select * from A;

2017-04-30 08:51:17.833084  A 12  Invalid digit, Value 'U', Pos 0, Type: Long                                                                                                                                                                                
2017-04-30 08:51:17.833083  A 11  Invalid digit, Value 'U', Pos 0, Type: Long
2017-04-30 08:51:17.833082  A 10  Invalid digit, Value 'U', Pos 0, Type: Long

问题是我尝试将此输出转换为csv格式,如-o output.csv

最后一列值拆分为无效数字 - 第4列值'U' - 第5列Pos 0 - 第6列类型:长 - 第7列由于','列在列中。所以我想删除上一栏中的逗号 我的预期输出是

col1                      col2 col3            col4
2017-04-30 08:51:17.833084  A 12  Invalid digit Value 'U' Pos 0 Type: Long                                                                                                                                                                                
2017-04-30 08:51:17.833083  A 11  Invalid digit Value 'U' Pos 0 Type: Long
2017-04-30 08:51:17.833082  A 10  Invalid digit Value 'U' Pos 0 Type: Long

我的命令是:

"select * from values;" | sed -e "s/,/-/g"  >> outputfile.csv

但它会更改所有列

2 个答案:

答案 0 :(得分:1)

正如评论中所提到的,最好在数据库级别解决它,因为您的分隔符看起来像space,这会给您不正确的结果。因此,您的选择查询将是:

select col1,col2,col3,replace(col4,',','-') as col4 from values

编辑:根据Ed的建议,您可以将comma硬编码为分隔符,并在单个select子句中替换第四列中的逗号。像

这样的东西
select col1||','||col2||','||col3||','||replace(col4,',','-') from values

如果您绝对想在Unix中处理它,那么假设分隔符是tab字符,请使用如下所示的内容。 (我不确定这是默认分隔符,但您可以使用set colsep |将分隔符设置为管道来更改它。下面的答案假定tab为分隔符。

awk -F"\t" '{ gsub(",","-",$4); print $0}'

编辑:根据Ed,this would replace all tabs (FSs) with single blank chars (OFSs) - you'd need this instead

 awk 'BEGIN{FS=OFS="\t"} {gsub(/,/,"-",$4)} 1'

答案 1 :(得分:0)

我不知道我是否得到你的问题的建议。但是如果你想摆脱每一行中的每一个,,你必须用sed做到这一点,试试这个:

$ cat file
2017-04-30 08:51:17.833084  A 12  Invalid digit, Value 'U', Pos 0, Type: Long
2017-04-30 08:51:17.833083  A 11  Invalid digit, Value 'U', Pos 0, Type: Long
2017-04-30 08:51:17.833082  A 10  Invalid digit, Value 'U', Pos 0, Type: Long
$
$ sed 's/\(^[0-9]*.*Pos\s[0-9]\)\(,\)\(.*$\)/\1\3/g' file
2017-04-30 08:51:17.833084  A 12  Invalid digit, Value 'U', Pos 0 Type: Long
2017-04-30 08:51:17.833083  A 11  Invalid digit, Value 'U', Pos 0 Type: Long
2017-04-30 08:51:17.833082  A 10  Invalid digit, Value 'U', Pos 0 Type: Long

在这种情况下,sed做了什么?

我们使用sed的全局g替换s命令s/regex/pattern/g。 该模式是三个正则表达式组\(regex\)的元素, 这里是第一个\1和最后一个\3。 第二个正则表达式组(此处为,\(,\))将在替换中省略。