Unix并行解压缩文件并存储它们

oyxsuwqo  于 2022-10-17  发布在  Unix
关注(0)|答案(1)|浏览(201)

我有一个包含2000个压缩文件的目录/user/test。我想检查如果任何给定的文件有5条记录,那么我必须以解压缩的格式存储它。
我能够连续地做这件事,但完成这项工作需要很多时间。
我连续地做了如下工作:

for i in `find /user/test -iname "abc*.gz"`;
do
    lines=`zcat $i | wc -l`
    if [ $lines = 5 ]; then
        fname=`basename -s .$file_ext $i`
        echo "copying $fname to new path"
        `zcat $i > new_path/$fname`
        cnt=$((cnt+1))
    else
        echo "Ignoring file $i. Expecting 5 records. It has more or less records"
    fi
done

我想同时做同样的事情。
我尝试浏览GNU parallel,但看到一个错误。我在指挥部下面试过了

find /user/test -iname "abc*.gz" |
parallel 'zcat {} | awk 'NR == 5 {print $0}' < {}.txt'

上面的命令不起作用,抛出错误。

xytpbqjk

xytpbqjk1#

未经测试:

doit() {
  zcat "$@" | awk 'NR == 5 {print $0}'
}
export -f doit
find /user/test -iname "abc*.gz" |
  parallel doit

根据您连续执行的操作:

doit() {
    i="$1"
    lines=`zcat $i | wc -l`
    if [ $lines = 5 ]; then
        fname=`basename -s .$file_ext $i`
        echo "copying $fname to new path"
        `zcat $i > new_path/$fname`
    else
        echo "Ignoring file $i. Expecting 5 records. It has more or less records"
    fi
}
export -f doit
export file_ext 

find /user/test -iname "abc*.gz" | parallel doit

其总体思想是构建一个bash函数,该函数处理单个输入。export函数(以及该函数所需的变量)并并行运行该函数。
这样做的好处是,在单个输入上测试该函数非常容易。
在编写函数时有一个小问题:函数不能写入硬编码文件,因为这会造成争用条件(多个示例同时写入)。因此,您需要以一种不会发生这种情况的方式编写函数。

相关问题