我一直有这个问题,我在网上搜索过,但没有结果,所以我想在这里寻求帮助。
我有一个大约有 80,000,000 行的文件。我的工作是将它们分割成每个 500,000 行的文件。好吧,我使用代码:
#split -l 500000 myfile segment
问题1:但是,之后我有一个具体的任务。在原始文件中,第一行是ID
,我应该将此行复制到最顶部的每个拆分文件中(以便每个拆分文件在第一行都有此 ID 行)。
我已经尝试过代码:
#sed -n 1,1p originalFile >> splitFile
它以某种方式完成了这项工作,但它将该ID
行附加到每个拆分文件的最底部。我希望有一个代码,可以将此ID
行放在每个拆分文件的最顶部(第一行)。
问题2(顺便说一句)。我有大约。 170 个分割文件。是否可以编写一个循环来将 ID 行附加到每个拆分文件的最顶部?
我将不胜感激每一条建议!
答案1
你的命令
$ sed -n "1,1p" originalFile >>splitFile
splitFile
会将ID 添加到since的末尾>>
告诉 shell附加流到文件。它也非常慢,因为在退出之前sed
会处理所有 80M 行。originalFile
拆分后,您将拥有大约 160 个名为 、 等的文件xaa
。让我们分步骤将原始文件中的标头添加到这些文件中xab
:xac
head -n 1 originalFile >id_line.txt
for f in x??; do
cat id_line.txt "$f" >tmpfile && mv tmpfile "$f"
done
rm id_line.txt
第一个命令将第一行提取originalFile
到它自己的文件id_line.txt
.
该循环迭代所有生成的文件,假设您使用了split
默认前缀等,并将id_line.txt
和 分割文件连接到一个名为tmpfile
.如果顺利的话,tmpfile
替换分割文件。
最后一行删除了id_line.txt
现在已经达到其目的的内容。
答案2
就这样简单。
(head -n1 fileA.txt; cat fileB.txt) >result.tmp
文件 result.tmp 将是 FileB,FileA 行位于其第一行上方。
当您看到更改时,就像您想要将 result.tmp 移动到 fileB.txt 一样。
您没有在问题中指定要在 fileB 中插入 fileA 的哪一行,所以我假设您想要第一行。
答案3
在覆盖之前尝试获取splitFile
with的内容。cat
echo -e "$(sed -n 1,1p originalFile)\n$(cat splitFile)" > splitFile
这很容易阅读,但对于大量文件来说可能会变得昂贵。
答案4
尝试使用 sed
$ sed -i "1i$(sed -n 1p originalFile)" splitFile
1i
插入文件第 1 行后面的文本。$(sed -n 1p originalFile)
获取原始文件的第一行