首页 > 解决方案 > 填充 CSV 文件中的空白

问题描述

我有一个 CSV 文件,其中一些列是空的,例如

oski14,safe,0,13,53,4
oski15,Unknow,,,,0
oski16,Unknow,,,,0
oski17,Unknow,,,,0
oski18,unsafe,0.55,,1,2
oski19,unsafe,0.12,4,,56

如何用“空”一词替换所有空列。我尝试过使用 awk(这是我正在学习使用的命令)。

我希望有

oski14,safe,0,13,53,4
oski15,Unknow,empty,empty,empty,0
oski16,Unknow,empty,empty,empty,0
oski17,Unknow,empty,empty,empty,0
oski18,unsafe,0.55,empty,1,2
oski19,unsafe,0.12,4,empty,56

我试图只替换第 3 列,看看我是否在正确的轨道上

    awk -F '[[:space:]]' '$2 && !$3{$3="empty"}1' file

这给我留下了

oski14,safe,0,13,53,4
oski15,Unknow,,,,0
oski16,Unknow,,,,0
oski17,Unknow,,,,0
oski18,unsafe,0.55,,1,2
oski19,unsafe,0.12,4,,56

我也试过

    nawk -F, '{$3="\ "?"empty":$3;print}' OFS="," file

这导致

oski14,safe,empty,13,53,4
oski15,Unknow,empty,,,0
oski16,Unknow,empty,,,0
oski17,Unknow,empty,,,0
oski18,unsafe,empty,,1,2
oski19,unsafe,empty,4,,56

最后我尝试了

    awk '{if (!$3) {print $1,$2,"empty"} else {print $1,$2,$3}}' file

这给我留下了

oski14,safe,empty,13,53,4 empty
oski15,Unknow,empty,,,0 empty
oski16,Unknow,empty,,,0 empty
oski17,Unknow,empty,,,0 empty
oski18,unsafe,empty,,1,2 empty
oski19,unsafe,empty,4,,56 empty

标签: linuxawk

解决方案


使用支持带-E参数的 ERE 的 sed(例如 GNU sed 或 OSX/BSD sed):

$ sed -E 's/(^|,)(,|$)/\1empty\2/g; s/(^|,)(,|$)/\1empty\2/g' file
oski14,safe,0,13,53,4
oski15,Unknow,empty,empty,empty,0
oski16,Unknow,empty,empty,empty,0
oski17,Unknow,empty,empty,empty,0
oski18,unsafe,0.55,empty,1,2
oski19,unsafe,0.12,4,empty,56

您需要进行两次替换,因为给定的连续逗号(例如,,,一个正则表达式匹配)会用完前 2,秒,因此您将剩下,empty,,.

以上会将一个完全空的行更改为empty,让我们知道这是否是一个问题。


推荐阅读