我正在脚本内创建一个输出文件,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 的声明结束了
;
很长时间之后才注意到它是可选的。