我有一个巨大的csv文件(大约是TB)。
现在,我想在顶部插入一行标题。
例如,如果输入.csv如下所示:
1,2,3,4
22,3,23,1
我希望它看起来像
id1,id2,id3,id4
1,2,3,4
and so on
我如何从外壳、终端、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
编辑。 当我写这个答案时,我忽略了问题的"TB"部分。因此,不要使用此处介绍的方法。我仍然离开这篇文章,因为它宣传了这个奇妙工具的使用, 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
希斯
中回显"id1,id2,id3,id4".csv