根据约束在 csv 文件中附加文本的 shell 脚本

根据约束在 csv 文件中附加文本的 shell 脚本

在我的项目中,我有很多名为“config.csv”的文件。我的需求是根据某些约束在文件末尾添加一个配置。

- Get All config.csv files across the project.
- The config.csv should have 7 columns.
- Add if the property does not exist then add one at the end of the file.
- Sometimes there might be a new line character at the end. sometimes there might not be.

该物业看起来像这样。

1/1/1970,,propertyName,"Description of the Config","false",,1

我该如何编写脚本来完成这项任务。

免责声明:我是脚本编写的新手,想尽可能地自动化此类任务的执行过程。

答案1

创建以下文件:

add_conf.awk

BEGIN {FS=","}
NF!=7 {bad=1; exit 1}
      {print}
END   {if (!bad) print "1/1/1970,,propertyName,\"Description of the Config\",\"false\",,1"}

add_conf.sh

#!/bin/sh
tempfile=$(mktemp)

for f
do
        if awk -f add_conf.awk "$f" > "$tempfile"
        then
                cp "$tempfile" "$f"
        fi
done

rm "$tempfile"

然后执行chmod +x add_conf.sh。(当然,你可以把这些文件放在当前目录以外的其他地方;只需相应地调整文件名引用即可。)然后执行

find . -name config.csv -type f -exec ./add_conf.sh {} +

find命令将查找所有名为的纯文本文件config.csv 并将其(路径)名称传递给add_conf.sh。该脚本awk在每个文件上调用,将输出写入临时文件。如果进程awk报告成功,则脚本将输出复制回输入文件。

脚本将字段分隔符 (FS) 设置为逗号(这是处理逗号分隔文件时显而易见的做法)。如果它遇到任何包含除七个(逗号分隔)字段之外的行,它会设置标志awk并以状态 1 退出,因此 shell 脚本将认为此文件不合格并将其保留。否则,它会将每个输入行打印到(临时)输出文件。如果需要,它会在最后一行添加换行符。然后,如果文件到最后都没有问题,则添加新的数据行。add_conf.awkbad

笔记:

  • 以上内容是为 GNU 编写的awk。POSIXawk没有指定不以换行符结尾的输入数据的行为,并且它不支持该exit命令。
  • 我忽略了你的第三点,“如果属性不存在然后在文件末尾添加一个。”如果你解释清楚你的意思,它可能很容易添加。

相关内容