我有一个格式如下的 CSV 文件:
A @ B @ C @ D @ E
它应该有五列,不幸的是,有些缺少最后一列,例如:
A @ B @ C @ D
如何@
在缺少最后一列的每一行末尾添加额外内容?
假设空格是字段内容的一部分,并且分隔符是单独的“@”(尽管可以很容易地适应其他变体):
awk 'BEGIN {FS = OFS = "@"} {$5 = $5; print}' inputfile
AWK 创建缺少的中间字段。如果字段已存在,则将字段值设置为自身会保留现有内容,或者将其和任何介入的已创建字段设置为空字符串。
$ cat inputfile
A @ B @ C @ D @ E
A @ B @ C @ D
A @ B @ C
$ awk 'BEGIN {FS = OFS = "@"} {$5 = $5; print}' inputfile
A @ B @ C @ D @ E
A @ B @ C @ D @
A @ B @ C @@
这可能对您有用:
sed 's/@/&/4;t;s/\s*$/ @/' file
未经测试,但类似:
perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)'
像这样的东西可以工作:
cat foo.csv | sed -E "s/([^\@]+\@){3}([^\@]+)/&@/" | sed -E "s/\@\@/\@/"
这会读取 foo.csv 文件,然后在第四列之后添加一个 @,然后删除已经有一个的行上的重复项。
如果您可以使用 Python,这里有一个稍微聪明的解决方案,可以根据需要添加尽可能多的 @:
from sys import *
for line in stdin.readlines():
stdout.write(line.strip())
if (line.count('@') < int(argv[1])):
stdout.write(' @' * (int(argv[1]) - line.count('@')))
stdout.write('\n')
像这样称呼它:cat foo.csv | python fixcsv.py 4
awk -F'@' '{printf $0; if (NF == 4) {print "@"}}'
注意:输入A @ B @ C @ D
将导致输出A @ B @ C @ D@
。我故意将第 4 个值保持不变,但您当然可以选择添加一个额外的空间
假设您的字段不能包含@,并且您只希望在恰好有 4 个字段时发生替换,这应该是一个有效的 sed 解决方案:
$ sed -r 's/^([^@]*[[:space:]]@){3}[^@]+$/& @/' <<EOF
> A @ B @ C @ D @ E
> A @ B @ C @ D
> EOF
A @ B @ C @ D @ E
A @ B @ C @ D @
请注意,sed -r
假设 GNU sed。
替换为与文件一起使用的不同重定向。