我尝试通过 bash 添加一些标头到偶尔为空的 CSV 文件(因此有时该文件为空,有时会有数据)。到目前为止,我已经尝试过使用 sed 和 awk。
Sed:
sed -i '1liAge,Sex,Location' $nameOfFile
awk:
awk 'BEGIN{print "Age,Sex,Location"}1' $nameOfFile
这两个似乎都不起作用,因为没有添加标头。当我回显 $nameOfFile 时,会打印 csvInfo.csv,因此我不认为 $nameOfFile 有任何问题。不知道我哪里错了。
您的
sed
命令要求文件中至少已有一行,所以我认为您无法可靠地使其工作。
您拥有的 Awk 命令应该像这样工作,但它将结果写入标准输出。 如果您有 GNU Awk,则可以使用
-i inplace
获得类似于 sed -i
的行为;但可移植的解决方案是将结果写入临时文件,然后移回到旧文件的顶部。
awk 'BEGIN{print "Age,Sex,Location"}1' "$nameOfFile" >tmp
mv tmp "$nameOfFile"
另请注意 何时在 shell 变量周围加上引号。
如果您想避免添加已经存在的标头,您可以保留
BEGIN
块,但禁止打印旧标头(如果存在):
awk 'BEGIN{print "Age,Sex,Location"}
NR>1 || $0 !~ /^Age,Sex,Location$/' "$nameOfFile" >tmp
mv tmp "$nameOfFile"
对于生产脚本来说,临时文件的适当卫生在某种程度上涉及更多,但如果这只是供您个人使用,那么我们就将其保留。有关更多信息,也许可以查看在意外的 bash 退出中删除创建的临时文件