我有一个巨大的 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 执行此操作?/
就地,使用 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
这很简单:
{ echo "id1,id2,id3,id4"; cat file.csv; } > newfile.csv
使用简单的外壳连接。
编辑
在下面的讨论线程之后,我提出这个:
head.txt
然后 :
cat head.txt file.csv > newfile.csv
编辑。当我写这个答案时,我忽略了问题的“太字节”部分。因此,请勿使用此处介绍的方法。我仍然离开这篇文章,因为它宣传了这个美妙的工具,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
以“大文件安全”着称!
完毕。
没有简单的方法,您将不得不重写文件。可能最安全的方法是
( echo "id1,id2,id3,id4" ; cat file ) > newFile && rm file
IHTH
回声“id1,id2,id3,id4”>> data.csv