微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux sed命令 – 在csv行的每一端添加string

目前,我对ff CSV数据有问题。

COLUMN1,COLUMN2,COLUMN3,COLUMN4 apple1,apple2,apple3,apple4 banana1,banana2,banana3,caimito1,"caimito21 caimito22","caimito31 caimito32",caimito4

这看起来像这样:

╔══════════╦═══════════╦═══════════╦══════════╗ ║ COLUMN1 ║ COLUMN2 ║ COLUMN3 ║ COLUMN4 ║ ╠══════════╬═══════════╬═══════════╬══════════╬ ║ apple1 ║ apple2 ║ apple3 ║ apple4 ║ ║ banana1 ║ banana2 ║ banana3 ║ ║ ║ caimito1 ║ caimito21 ║ caimito31 ║ caimito4 ║ ║ ║ caimito22 ║ caimito32 ║ ║ ╚══════════╩═══════════╩═══════════╩══════════╝

所以我的计划是添加COLUMN5,它的每一行都会有一个值“FRUIT”。

使用的命令:

将CSV值导入Bash

在bash(Linux)中查找另一个csv的值(如vlookup)

Powershell将variables传递给作业

使用脚本将.csv文件加载到MysqL数据库

使用自定义文件名path复制csv

sed "1 s/$/,COLUMN5/g" FILE.csv | sed "2,$ s/$/,FRUIT/g" > OUTPUT.csv

输出

╔══════════╦════════════════╦════════════════╦══════════╦═════════╗ ║ COLUMN1 ║ COLUMN2 ║ COLUMN3 ║ COLUMN4 ║ COLUMN5 ║ ╠══════════╬════════════════╬════════════════╬══════════╬═════════╣ ║ apple1 ║ apple2 ║ apple3 ║ apple4 ║ FRUIT ║ ║ banana1 ║ banana2 ║ banana3 ║ ║ FRUIT ║ ║ caimito1 ║ caimito21FRUIT ║ caimito31FRUIT ║ caimito4 ║ FRUIT ║ ║ ║ caimito22 ║ caimito32 ║ ║ ║ ╚══════════╩════════════════╩════════════════╩══════════╩═════════╝

有什么办法可以在不影响“caimito”行的情况下添加“FRUIT”?

我也试过ff。 指挥,但没有成功。 在“$”之前添加“,”。

sed "1 s/$/,$ s/,$/,FRUIT/g" > OUTPUT.csv

在batch file中用批处理脚本与vbscript命令问题

odo在csv和MysqL之间转换数据

如何使用awk或sed调整bash中的列字段的长度?

MysqL导出后找不到文件

从长行删除一个字段的位置

Sed可能不是处理csv文件的正确工具,因为规则比看上去更复杂(这可能是可能的,但是这样的脚本通常比较容易出错等)。 但是,您可以使用csvtools来处理这个问题:

file="FILE.csv" nr=$(csvtool height $file) ot=$(perl -e "print "COLUMN5\n";for$i(2..$nr){print "FRUIT\n";}") echo "$ot" | csvtool paste "$file" -

脚本工作如下:

首先我们计算csvtool height的行数,

接下来我们通过打印COLUMN5然后n-1次FRUIT产生附加列。

最后,我们将该内容粘贴到文件的右侧。

编辑:我只看到csvtool解决方案; 这当然是更实际的。 我离开这个解决方案主要是因为隐藏它和它的lovecraftian美是可惜的。

那么,这里呢。 这是一个在sed中完成的方法

sed ':a $!{ N; ba }; s/"[^"]*"/{&}/g; :bs/({"[^"]*)n([^"]*"})/1~"~2/g; tb; s/n|$/,FRUIT&/g; s/,FRUIT(n|$)/,COLUMN51/; :cs/({"[^"])*~"~/1n/g; tc; s/{"|"}/"/g' filename

这将是一个有点蹊跷。 它的工作原理如下:

:a $!{ N; ba } # assemble the whole file in the # hold buffer s/"[^"]*"/{&}/g # encase all "-enclosed fields in # {"..."} to make matching the beginning # and end separately possible. :b # jump mark for looping s/({"[^"]*)n([^"]*"})/1~"~2/g # replace the first newline in all # {"..."} fields with ~"~ tb # loop until all were replaced s/n|$/,FRUIT&/g # Put FRUIT at the end of all lines s/,COLUMN51/ # Replace the first,FRUIT with,COLUMN5 # The (n|$) bit is so that this # works with empty files (that only # have a header line) :c # Jump mark for looping s/({"[^"])*~"~/1n/g # replace the first ~"~ in all {"..."} # fields with a newline tc # loop until all were replaced s/{"|"}/"/g # replace all {","} markers with " # again.

sed '1 { s/$/,COLUMN5/ b } :load /^([^"]*"[^"]*")*[^"]*"[^"]*$/ { N b load } s/$/,/;s/^(([^,]*,){4}).*/1FRUIT/' YourFile

第一行添加COLUMN5比循环( b )

如果打开"在当前工作缓冲区中,则加载新行并重试该操作

添加4,认情况下

先将4个第一组分开,再加上FRUIT

(周期)

POSIX版本so --posix在GNU sed上使用

对于一个“有效的” csv(1行,所有参数分开,),只需删除加载循环部分

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐