我正在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函数,但我不明白如何将它放在脚本中。
发布于 2022-01-27 13:59:54
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上面的工具将使用任何版本的工具。在大多数awk版本中,任何不调用close()的awk解决方案都会失败,一旦您超过了某个同时打开的文件数的阈值,而我已经看到该阈值小于20。
发布于 2022-01-27 13:40:09
压缩可以在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" ;
};的陈述,后来才意识到这是一种选择。https://unix.stackexchange.com/questions/688173
复制相似问题