首页 > 解决方案 > 从巨大的 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

我有很多以以下任一开头的行:

这个想法是不要复制从前四行之一H|开始的行,并将(在行的开头)替换为,H|Q|(在行的开头)替换为,,Q|

但现在我需要:

实际上有数百个 .txt.gz 文件,每个大约 1GB,以这种方式处理(都在同一个文件夹中)。是否有一种 CLI 方法可以在所有这些上并行运行代码(因此每个核心将被分配目录中文件的一个子集)?

--我用的是linux --ubuntu

标签: linuxubuntuawksedgrep

解决方案


未经测试,但可能与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

推荐阅读