ファイルからパターンを検索しながら awk ステートメントを中断する

ファイルからパターンを検索しながら awk ステートメントを中断する

33GBのファイルがあります。このファイルの最初の列は国コードです(例:AT、BE、CA、DE、DK、GB、IE、ITなど)。私は次のようにawkコマンドを使用しています。

awk -F"|" '$1~/^AT/ {print $0}'

このコマンドはうまく動作します。ただし、awkがファイル全体を読み取るのに約1.5時間かかります。

検索パターンが完了したら、awkコマンドを中断する方法はありますか?

例:AT検索が終了したら、ファイルの残りの部分の検索を停止する必要があります。

作業中のファイルがソートされています。

答え1

ファイルの次のコードがわかっている場合

awk '/^BE/ { exit }; /^AT/' file

また、この-Fオプションは隔離されたシナリオでは実際には役に立ちません。目的の特定のタスクであれば、デフォルトの{ print $0 }タスクを明示的に提供する必要はありません。

これを繰り返し実行する必要がある場合は、単一のスクリプトを使用して元のファイルを一度に区別したいファイル部分を抽出する方が効率的です。全体(または主要部分)を抽出する場合も参照してください。csplit(すべて抽出した後に不要なファイルを削除しますか?)

答え2

ファイルが並べ替えられているので、文字列比較を使用して、探しているフィールドの後に最初のフィールドが並べ替えられるタイミングを知ることができます。

awk -F"|" '$1 ~ /^AT/ {print $0} $1 > "AT" {exit}'

もちろん、これはアルファベットの後半にあるコードの最初の項目をより早く見つけることができないため、より複雑な作業には適切なインデックスを使用することを検討することをお勧めします。

答え3

もちろん、以下を追加してくださいexit

awk -F"|" '$1~/^AT/ {print $0; exit}'

これにより、最初のフィールドがで始まる最初の行を見つけるとすぐに終了しますAT。最初のフィールドの最初の行を見つけたらすぐに停止するにはいいえ最初から次のものをAT使用できます。

awk -F"|" '{if($1~/^AT/){print $0}else{exit}}' 

行が最初の行の前で始まらず、次から始まる行を印刷して停止するには、AT次のようにします。AT

awk -F"|" '{if($1~/^AT/){print $0; a=1}else if(a==1){exit}}'  

関連情報