awk 脚本中的 Gunzip

awk 脚本中的 Gunzip

我正在脚本内创建一个输出文件,awk然后我想压缩该文件。

输入文件 - Marks.txt

Student1:AP:Maths:30:Science:43
Student2:AP:Maths:23:Science:35
Student3:Non_AP:Maths:17:Science:33

我的代码如下所示

BEGIN{
   FS = ":"
}

$2 == "AP"{
 print $3, $4 > "maths_AP.txt"
}

$2 == "Non_AP"{
 print $3, $4 > "maths_non_AP.txt"
}

{...} #some other processing not relevant to question

我想将maths_AP.txt和都创建maths_non_AP.txt为压缩文件。一些论坛建议使用gunzip函数,但我不明白如何将它放在脚本中。

答案1

awk 是一个用于操作文本的工具。 shell 是一种用于操作(创建/销毁)文件和进程以及对其他工具的调用进行排序的工具。因此,您通常不应该从 awk 内部顺序调用其他工具,因为这是 shell 的工作,而是使用 awk 操作文本,然后让 shell 调用任何其他工具,例如未经测试的工具:

mkdir out &&
sort -t':' -k3,3 -k2,2 Marks.txt |
awk '
    BEGIN { FS=OFS=":" }
    { key = "out/" $3 "_" $2 ".txt" }
    key != out {
        close(out)
        out = key
    }
    { print > out }
' &&
for file in out/*.txt; do
    zip "$file" &&
    rm -f "$file"         # assuming you want to discard the .txt file
done

上述内容适用于任何版本的工具。close()一旦超过同时打开文件的最大数量阈值(我发现小于 20 个),任何不调用的 awk 解决方案都会在大多数 awk 版本中失败。

答案2

压缩可以在 awk 运行之后或运行期间完成。

尝试

$2 == "AP"{
 print $3, $4 > "maths_AP.txt" ;
 print $3, $4 | "gzip > maths_AP.gz" ;
}

$2 == "Non_AP"{
 print $3, $4 > "maths_non_AP.txt" ;
 print $3, $4 | "gzip > maths_non_AP.gz" ;
}
  • 如果要写入的文件太多,您可能会用完文件描述符。
  • 我在 awk 的声明结束了;很长时间之后才注意到它是可选的。

相关内容