awk:无法打开“filename”进行输出(打开的文件太多)

awk:无法打开“filename”进行输出(打开的文件太多)

罪魁祸首就是这里:

zcat Merged.csv.gz | awk -F, 'FNR == 1  {header = $0; next} !seen[$7]++ {print header | "gzip > data/S20180528_"$7".txt.gz"} {print | "gzip > data/S20180528_"$7".txt.gz";}'

当我在这个大文件(Merged.csv.gz)上运行它时,我得到:

awk: cannot open "gzip > data/S20180528_2505329.txt.gz" for output (Too many open files)

我通过粘贴在这里和 stackoverflow 上找到的部分内容创建了原始命令。在 Google 上搜索后,我觉得这样做可能弄乱了一些引号。现在,我不知道是哪些引号。

答案1

这意味着您必须关闭打开的文件句柄。

可能更干净

zcat Merged.csv.gz | 
    awk -F, '
        FNR == 1  {header = $0; next} 
        !seen[$7]++ {
            file[$7] = "data/S20180528_"$7".txt"
            print header > file[$7]
            close(file[$7])
        }
        {print >> file[$7]; close(file[$7])}
        END {
            for (f in file) system("gzip " file[f])
        }
    '

由于文件按第 7 列排序:

zcat Merged.csv.gz | awk -F, '
    FNR == 1  {header = $0; next} 
    $7 != key {
        if (file) {
            close(file)
            system("gzip " file)
        }
        file = "data/S20180528_" $7 ".txt"
        key = $7
        print header > file
    }
    {print > file}
    END { close(file); system("gzip " file) }
'

相关内容