目前,我对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传递给作业
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命令问题
如何使用awk或sed调整bash中的列字段的长度?
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 ':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个第一组分开,再加上FRUIT
(周期)
POSIX版本so --posix在GNU sed上使用
对于一个“有效的” csv(1行,所有参数分开,),只需删除加载循环部分
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。