我有我的三个大文件的场景Test.txt
,Test1.txt
并Test2.txt
具有以下详细信息。
H|||||||||||||||||||||||
D||||||||||||||||||||||||
D|||||||||||||||||||||||
H|||||||||||||||||||||
D||||||||||||||||||||||||
D||||||||||||||||||||||||
T||||||||||||||||||||||||
Run Code Online (Sandbox Code Playgroud)
我必须删除除 D 行以外的所有行。在我的所有三个文件中,它应该如下所示。(超过 10 GB)
D||||||||||||||||||||||||
D|||||||||||||||||||||||
D||||||||||||||||||||||||
D||||||||||||||||||||||||
Run Code Online (Sandbox Code Playgroud)
因此,在仅保留Test.txt
,Test2.txt
和 中的D 行之后Test3.txt
,我必须将它们合并到新文件中。
我已经使用sed完成了上述操作。
sed '/^\('D'\)|/!d' $Filename.txt >> $NewFilename.txt
Run Code Online (Sandbox Code Playgroud)
但由于文件很大,需要很长时间。
我们可以使用任何其他命令以有效的方式执行此操作吗?
Sté*_*las 13
cat Test.txt Test2.txt Test3.txt | LC_ALL=C grep '^D' > newfile.txt
Run Code Online (Sandbox Code Playgroud)
或者:
for file in Test.txt Test2.txt Test3.txt; do
LC_ALL=C grep '^D' < "$file"
done > newfile.txt
Run Code Online (Sandbox Code Playgroud)
或者,如果您grep
喜欢 GNUgrep
支持该-h
选项(以避免打印文件名):
LC_ALL=C grep -h '^D' Test.txt Test2.txt Test3.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)
通过使用LC_ALL=C
我们可以避免grep
尝试解析 UTF-8 数据。通过使用^D
,grep
将只查看每行的第一个字符。grep
,尤其是 GNUgrep
通常比sed
.