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はテキストを操作するツールです。シェルは、ファイルとプロセスを操作(作成/破棄)し、他のツールへの呼び出し順序を指定するためのツールです。したがって、通常、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ステートメントが終わって;からしばらくして、それがオプションであることを知りませんでした。

関連情報