23

我有一个巨大的 csv 文件(以 TB 为单位)。

现在,我想在顶部插入一行作为标题。

例如,如果 input.csv 看起来像这样:

 1,2,3,4
 22,3,23,1

我希望它看起来像

id1,id2,id3,id4
 1,2,3,4
 and so on

我如何从 shell、终端、awk、bash 执行此操作?/

4

5 回答 5

38

就地,使用 sed:

sed -i 1i"id1,id2,id3,id4" file.csv

编辑:

正如@Ed Morton 指出的那样,使用 sed 和-i开关 sed 编辑文件,因此在编辑大文件时可能很危险。如果您在-i选项后提供前缀,则 sed 会创建备份。所以这样的事情会更安全:

sed -i.bak 1i"id1,id2,id3,id4" file.csv

然后原始文件将位于file.csv.bak

于 2012-11-15T17:33:12.753 回答
17

这很简单:

{ echo "id1,id2,id3,id4"; cat file.csv; } > newfile.csv

使用简单的外壳连接。

编辑

在下面的讨论线程之后,我提出这个:

  • 用你的标题创建一个文件,说head.txt

然后 :

cat head.txt file.csv > newfile.csv
于 2012-11-15T17:20:23.063 回答
3

编辑。当我写这个答案时,我忽略了问题的“太字节”部分。因此,请勿使用此处介绍的方法。我仍然离开这篇文章,因为它宣传了这个美妙的工具,ed标准文本编辑器的使用。

像往常一样,ed是标准的文本编辑器。正如它所提到的,使用的解决方案sed -i并不是“就地编辑文件”。相反,它将其内容输出到一个临时文件,然后将此文件重命名为原始文件。这对于大文件真的不好!

使用ed而不是真正编辑文件。大致如下:

#!/bin/bash

file="input.csv"

{
ed -s "$file" <<EOF
1
i
id1,id2,id3,id4
.
wq
EOF
} > /dev/null

解释:1到第一行,i进入插入模式,然后我们插入,id1,id2,id3,id4然后.回到正常模式,wq写入并退出。

使用这种方法,您实际上是在编辑文件,它比 sed 方法快两倍。此外,ed以“大文件安全”着称!

完毕。

于 2012-11-15T18:45:48.230 回答
1

没有简单的方法,您将不得不重写文件。可能最安全的方法是

 ( echo "id1,id2,id3,id4" ; cat file ) > newFile && rm file

IHTH

于 2012-11-15T17:21:00.113 回答
-2

回声“id1,id2,id3,id4”>> data.csv

于 2021-03-03T06:13:10.850 回答