スクリプト内で出力ファイルを生成し、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はテキストを操作するツールです。シェルは、ファイルとプロセスを操作(作成/破棄)し、他のツールへの呼び出し順序を指定するためのツールです。したがって、通常、awk内で他のツールを順番に呼び出すべきではありません。なぜならこれはシェルの仕事だからです。代わりに awk を使用してテキストを操作し、シェルにテストされていないツールなどの他のツールを呼び出すようにします。
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()
awkを呼び出さないソリューションは、同時に開いているファイルの最大数しきい値を超えると、ほとんどのawkバージョンで失敗します(20個未満であることがわかりました)。
答え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ステートメントが終わって
;
からしばらくして、それがオプションであることを知りませんでした。