linux sed命令 - 在csv行的每一端添加字符串

ban*_*ana 9 unix linux csv sed

目前我的ff CSV数据存在问题.

COLUMN1,COLUMN2,COLUMN3,COLUMN4
apple1,apple2,apple3,apple4
banana1,banana2,banana3,
caimito1,"caimito21
caimito22","caimito31
caimito32",caimito4
Run Code Online (Sandbox Code Playgroud)

这看起来像这样:

???????????????????????????????????????????????
? COLUMN1  ?  COLUMN2  ?  COLUMN3  ? COLUMN4  ?
???????????????????????????????????????????????
? apple1   ? apple2    ? apple3    ? apple4   ?
? banana1  ? banana2   ? banana3   ?          ?
? caimito1 ? caimito21 ? caimito31 ? caimito4 ?
?          ? caimito22 ? caimito32 ?          ?
???????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

所以我的计划是添加COLUMN5,它的每一行都有一个值"FRUIT".

使用的命令:

sed "1 s/$/,COLUMN5/g" FILE.csv | sed "2,$ s/$/,FRUIT/g" > OUTPUT.csv
Run Code Online (Sandbox Code Playgroud)

输出:

???????????????????????????????????????????????????????????????????
? COLUMN1  ?  COLUMN2       ?  COLUMN3       ? COLUMN4  ? COLUMN5 ?
???????????????????????????????????????????????????????????????????
? apple1   ? apple2         ? apple3         ? apple4   ? FRUIT   ?
? banana1  ? banana2        ? banana3        ?          ? FRUIT   ?
? caimito1 ? caimito21FRUIT ? caimito31FRUIT ? caimito4 ? FRUIT   ?
?          ? caimito22      ? caimito32      ?          ?         ?
???????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

有没有办法在不影响"caimito"行的情况下添加"FRUIT"?

我也试过了ff.命令,但它没有成功.在"$"之前添加",".

sed "1 s/$/,COLUMN5/g" FILE.csv | sed "2,$ s/,$/,FRUIT/g" > OUTPUT.csv
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 2

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" -
Run Code Online (Sandbox Code Playgroud)

该脚本的工作原理如下:

  1. 首先我们计算行数csvtool height
  2. COLUMN5接下来,我们通过打印然后n-1次来生成附加列FRUIT
  3. 最后我们将该内容粘贴到文件的右侧。