![根据约束在 csv 文件中附加文本的 shell 脚本](https://linux22.com/image/1475319/%E6%A0%B9%E6%8D%AE%E7%BA%A6%E6%9D%9F%E5%9C%A8%20csv%20%E6%96%87%E4%BB%B6%E4%B8%AD%E9%99%84%E5%8A%A0%E6%96%87%E6%9C%AC%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC.png)
在我的项目中,我有很多名为“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.awk
bad
笔记:
- 以上内容是为 GNU 编写的
awk
。POSIXawk
没有指定不以换行符结尾的输入数据的行为,并且它不支持该exit
命令。 - 我忽略了你的第三点,“如果属性不存在然后在文件末尾添加一个。”如果你解释清楚你的意思,它可能很容易添加。