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
但它会更改所有列
答案 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
。
第二个正则表达式组(此处为,
,\(,\)
)将在替换中省略。