删除除 D 之外的所有行

UNI*_*est 4 shell-script

我有我的三个大文件的场景Test.txtTest1.txtTest2.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.