【问题标题】:Adding headers to sometimes empty CSV file via bash script通过 bash 脚本将标题添加到有时为空的 CSV 文件
【发布时间】:2021-08-16 22:44:37
【问题描述】:

我正在尝试通过 bash 向偶尔为空的 CSV 文件添加一些标题(因此有时文件会是空的,有时会包含数据)。到目前为止,我已经尝试过使用 sed 和 awk。

Sed:

sed -i '1liAge,Sex,Location' $nameOfFile

Awk:

awk 'BEGIN{print "Age,Sex,Location"}1' $nameOfFile

这两个似乎都不起作用,因为没有添加标题。当我回显 $nameOfFile 时,会打印 csvInfo.csv,所以我认为 $nameOfFile 没有任何问题。不知道我哪里出错了。

【问题讨论】:

  • printf '%s\n' '0a' "Age,Sex,Location" . %p Q | ed -s "$nameOfFile"
  • 如果是空文件,echo header1,header2,etc. > file.csv?
  • 如果它没有行,sed 命令将不起作用(如果它甚至有效 - 什么是 li?)。 awk 命令不会覆盖原始命令。不完全确定“空的 CSV 文件”是什么意思。如果它是空的,为什么不直接将标题回显到其中?
  • @jhnc 该文件不会一直为空。有时它会包含数据,有时它不会,所以我试图让它适用于这两种情况。
  • @Jetchisel 正在打印到控制台,但我想编写(修改)CSV 文件。

标签: bash


【解决方案1】:

你的sed 命令要求文件中至少有一行,所以我认为你不能让它可靠地工作。

您拥有的 Awk 命令应该可以这样工作,但它会将其结果写入标准输出。如果你有 GNU Awk,你可以使用-i inplace 来获得类似于sed -i 的行为;但可移植的解决方案是将结果写入临时文件,然后移回到旧文件之上。

awk 'BEGIN{print "Age,Sex,Location"}1' "$nameOfFile" >tmp
mv tmp "$nameOfFile"

另请注意When to wrap quotes around a shell variable

如果您想避免添加已经存在的标头,可以保留 BEGIN 块,但禁止打印旧标头(如果存在):

awk 'BEGIN{print "Age,Sex,Location"}
    NR>1 || $0 !~ /^Age,Sex,Location$/' "$nameOfFile" >tmp
mv tmp "$nameOfFile"

对于生产脚本来说,对临时文件进行适当的清理在某种程度上涉及更多,但如果这只是供您个人使用,让我们把它留在这里。如需更多信息,请查看Removing created temp files in unexpected bash exit

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 2021-06-04
    • 2015-12-02
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多