【发布时间】:2017-07-03 15:44:41
【问题描述】:
我有一个从 postgresql 表导出的多个字段,包括布尔值(由 postgresql 导出为 t 和 f 字符),我需要将它导入另一个无法理解的数据库 (monetdb) f 作为布尔值。
(EDIT删除了空格以反映真实的文件方面并避免愤怒的 cmets - 以前显示空格)
id|val_str|bool_1|bool2|bool_3|bool4|
1|help|t|t|f|t|
2|test|f|t|f|f|
...
由于我无法替换所有出现的 t/f 我需要在我的模式中集成字段分隔符。
我尝试使用awk 将字段t 替换为TRUE 并将f 替换为FALSE:
awk -F'|' '{gsub(/\|t\|/, "|TRUE|"); gsub(/\|f\|/, "|FALSE|"); print;}'
这是部分工作,因为具有相同值 (|t|t|) 的连续字段只会替换第一个匹配项(|TRUE|t| - 因为第二个匹配项实际上是 t| 而不是 |t|)。
id|val_str|bool_1|bool2|bool_3|bool4|
1|help|TRUE|t|FALSE|TRUE|
2|test|FALSE|TRUE|FALSE|f|
...
表有大约 450 列,所以我不能真正指定要替换的列列表,也不能在 postgres 中“转换”布尔列(我可以但......)。
我可以运行 gsub() 两次,但我正在寻找更优雅的方式来匹配所有字段的整个字段内容。
gsub(/^t$/, ...) 也无济于事,因为我们大部分时间都在排队。
【问题讨论】:
-
您是否考虑过让 postgresql 输出所需格式的可能性?我本来希望有一个标志或其他一些参数使它变得容易,它看起来像there's no such thing but it's still possible。
-
[Original file has no space]是什么意思?如果您发布的示例输入与您的真实数据格式不同,那么显然,请修复它,否则您将获得一个比必要的更复杂的解决方案,或者一个不起作用的解决方案,任何一种方式都会浪费人们的时间。如果这只是一个完全不相关的陈述,那就去掉它。 -
我认为它会更容易阅读。
标签: bash postgresql awk monetdb