linux - 从巨大的 txt.gz 文件中选择/复制包含字符串的行的最快方法
问题描述
所以我有以下sed
一个班轮:
sed -e '/^S|/d' -e '/^T|/d' -e '/^#D=/d' -e '/^##/d' -e 's/H|/,H|/g' -e 's/Q|/,,Q|/g' -e '1 i\,,,' sample_1.txt > sample_2.txt
我有很多以以下任一开头的行:
S|
T|
#D=
##
H|
Q|
这个想法是不要复制从前四行之一H|
开始的行,并将(在行的开头)替换为,H|
和Q|
(在行的开头)替换为,,Q|
但现在我需要:
- 尽可能使用最快的方式(互联网建议 (m)awk 比 sed 快)
- 从 .txt.gz 文件读取并将结果保存在 .txt.gz 文件中,如果可能,避免中间解压缩/重新压缩
实际上有数百个 .txt.gz 文件,每个大约 1GB,以这种方式处理(都在同一个文件夹中)。是否有一种 CLI 方法可以在所有这些上并行运行代码(因此每个核心将被分配目录中文件的一个子集)?
--我用的是linux --ubuntu
解决方案
未经测试,但可能与GNU Parallel非常接近。
首先制作输出目录,以免覆盖任何有价值的数据:
mkdir -p output
现在声明一个处理一个文件并将其导出到子进程的函数,以便GNU Parallel启动的作业可以找到它:
doit(){
echo Processing $1
gzcat "$1" | awk '
/^[ST]\|/ || /^#D=/ || /^##/ {next} # ignore lines starting S|, T| etc
/^H\|/ {print ","} # prefix "H|" with ","
/^Q\|/ {print ",,"} # prefix "Q|" with ",,"
1 # print all other lines
' | gzip > output/"$1"
}
export -f doit
现在并行处理所有txt.gz
文件并显示进度条:
parallel --bar doit ::: *txt.gz
推荐阅读
- r - write.table 不会从提取的不同 csv 文件中附加信息
- java - JMeter OutOfMemory 由于 groovy 脚本创建了几个类
- qt-creator - 如何在 Qt creator 的同一行中设置大括号
- asp.net-web-api - web.config 中的 MachineKey 在两个 IIS 应用程序之间不同步
- javascript - 二叉树添加一个未定义的节点
- php - 我的自定义消息请求验证器不起作用 Laravel
- php - 为什么我的 Laravel 5.7 会话不起作用?
- python - 抑制 python 警告
- javascript - 如何平滑滚动到其他页面?
- wordpress - 无法使用 Slick Slider / Twig 切换图像