33GBのパイプで区切られたフラットファイルがあります。
最初の列と20番目の列が条件を満たすファイルから特定の列を抽出する必要があります。
次のコードを使用して入力ファイルを処理します。
awk -F"|" '('$1~/^BL|^FR|^GF|^GP|^MC|^MF|^MQ|^NC|^PF|^PM|^RE|^TF|^WF|^YT/&&$20=="TRUE"') {print $0}' <input file> | cut -d'|' -f1-3,6,10,11,13,19,20 >> <output file>
$1
$20
入力ファイルの列位置です。
このコードはうまく動作します。ただし、データの抽出には約1.5時間かかります。ファイルをより迅速に処理する方法はありますか?
ベストアンサー1
を試してくださいgrep
。
(
export LC_ALL=C
grep -E '^(BL|FR|[GMTW]F|GP|M[CQ]|NC|PM|RE|YT)([^|]*\|){19}TRUE(\||$)' |
cut -d'|' -f1-3,6,10,11,13,19,20
)
@don_crisstiが提案したように、すべての行に20個以上のフィールドが含まれていると仮定すると、最初に切り取りを試みることもできます。これにより、各行のフィールド数と長さ、一致する行の割合に基づいてパフォーマンスが向上します。
(
export LC_ALL=C
cut -d'|' -f1-3,6,10,11,13,19,20 |
grep -xE '(BL|FR|[GMTW]F|GP|M[CQ]|NC|PM|RE|YT).*\|TRUE'
)