4

我有一个格式如下的 CSV 文件:

A @ B @ C @ D @ E

它应该有五列,不幸的是,有些缺少最后一列,例如:

A @ B @ C @ D

如何@在缺少最后一列的每一行末尾添加额外内容?

4

7 回答 7

7

假设空格是字段内容的一部分,并且分隔符是单独的“@”(尽管可以很容易地适应其他变体):

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 @@
于 2012-04-14T14:01:41.317 回答
2

这可能对您有用:

sed 's/@/&/4;t;s/\s*$/ @/' file
于 2012-04-14T12:29:09.630 回答
2

未经测试,但类似:

perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)'
于 2012-04-14T14:05:12.087 回答
1

像这样的东西可以工作:

cat foo.csv | sed -E "s/([^\@]+\@){3}([^\@]+)/&@/" | sed -E "s/\@\@/\@/"

这会读取 foo.csv 文件,然后在第四列之后添加一个 @,然后删除已经有一个的行上的重复项。

于 2012-04-14T11:10:31.617 回答
1

如果您可以使用 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

于 2012-04-14T11:18:44.840 回答
1
awk -F'@' '{printf $0; if (NF == 4) {print "@"}}'

注意:输入A @ B @ C @ D将导致输出A @ B @ C @ D@。我故意将第 4 个值保持不变,但您当然可以选择添加一个额外的空间

于 2012-04-14T11:22:46.180 回答
1

假设您的字段不能包含@,并且您只希望在恰好有 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。

替换为与文件一起使用的不同重定向。

于 2012-04-14T12:28:34.247 回答