Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在CSV文件的末尾添加额外的分隔符?是否发现缺少某些分隔符?_Bash_Csv_Awk - Fatal编程技术网

Bash 如何在CSV文件的末尾添加额外的分隔符?是否发现缺少某些分隔符?

Bash 如何在CSV文件的末尾添加额外的分隔符?是否发现缺少某些分隔符?,bash,csv,awk,Bash,Csv,Awk,我有一个如下格式的CSV文件: A @ B @ C @ D @ E 它应该有五列,不幸的是,有些缺少最后一列,例如: A @ B @ C @ D 如何在缺少最后一列的每行末尾添加一个额外的@ cat foo.csv | sed -E "s/([^\@]+\@){3}([^\@]+)/&@/" | sed -E "s/\@\@/\@/" 这将读取foo.csv文件,然后在第四列后添加一个@,然后删除已经有一个@的行上的重复项。如果可以使用Python,这里有一个稍微聪明的解决方案,可

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

A @ B @ C @ D @ E
它应该有五列,不幸的是,有些缺少最后一列,例如:

A @ B @ C @ D

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

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')
从系统导入*
对于stdin.readlines()中的行:
stdout.write(line.strip())
如果(line.count('@')
可以这样称呼它:
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's/^([^@]*[:space:][]@){3}[^@]+$/&/'A@B@C@D
>EOF
A@B@C@D@E
A@B@C@D@
请注意,
sed-r
假定GNU为sed


替换为用于文件的其他重定向。

这可能适用于您:

sed 's/@/&/4;t;s/\s*$/ @/' file

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

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 @@

未经测试,但类似于:

perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)'

由于删除换行符,您需要添加
else print”“
,或者,您可以说
{NF=5;print}
,这会得到相同的结果。@glennjackman:除了我的保留了超过五个字段的记录中的字段,而你的将这些记录截断为五个字段。这是非常聪明的。这有记录吗?@JS웃`: 如果你指的是关于创建中间字段和设置字段值的部分,那么。谢谢@DennisWilliamson,感谢链接。我从来不知道重建一个不存在的字段会为没有那么多字段的行创建这些字段。这就像perl的自动激活一样。文档确实解释了如何创建新字段,但没有明确说明此功能。真正的宝石。很遗憾,这些天我们没有看到你更多的答案。必须挖出旧帖子来学习<代码>:)
再次感谢!
perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)'