取り組み
gawkを使ってデータの必要部分を取り出す

約86,000件のデータの中に17ヶ所、983レコードを挿入します。
挿入する983レコードは36,678レコードのファイルから見つけ出さなければなりません。
挿入する場所が17ヵ所程度なら、17箇所分983レコードを取り出すことができれば、アナログで入れても、たいした手間にはありそうもないで、今回のミッションは、36,678レコードから983レコードを取り出すことになります。
gawk -f scriptget.awk FLG=1 list.txt FLG=0 pg.txt>get.txt
FLG=1 list.txt FLG=0
FLGが「1」の間は「list.txt」を読み込み、読み込みが終わるとFLGが「0」になります。
そのことに対応するgawkのスクリプトは、このようになります。
BEGIN{
FS="t";
OFS="t";
}
FLG==1{
ss=substr($0,17);
ss=ss+0;
ss=ss "00.pg1";
data[++cc]=ss;
next;
}
{
for(i=1;i<=cc;i++){
if($1==data[i])
print $0;
}
}
BEGIN
初回に一回だけ実行するための記述です。
FS="t";OFS="t";
FLG==1{は、入力ファイルも出力ファイルもセパレータを「タブ」にするという宣言です。
・
}
FLGが「1」の間、コマンドラインのように「list.txt」を読み込みます。
ss=substr($0,17);ss=ss+0;ss=ss "00.pg1";data[++cc]=ss;next;
1行目は、読み込んだデータの17バイト目から後ろを取り出して変数「ss」に代入します。「substr」は、本来なら「17バイト目から何バイト」というふうに指定しますが、文字列の最後までなら3番目の引数は省略可能です。
ss=ss+0;
は頭に「0」がついている数字列もあるので、「0」を足すふりをして変数「ss」を数値化することで頭のゼロを消しています。その直後に、「00.pg1」というような文字列を足しているので、変数「ss」はここで再度、文字列になります。それを「data」という配列に格納しています。
next;
で、次の行を読み込みに行きます。
for(i=1;i<=cc;i++){
if($1==data[i])
print $0;
}
「cc」は「list.txt」のレコード数なので、その数だけループを回しながら対象テキストファイル「pg.txt」の第1列目の値との整合を見、整合していたら出力しています。「print $0」とするときは、BEGINで「OFS="¥t"」を宣言しておかないとセパレータが半角スペースになってしまいます。
ということで、これから約86,000件のデータの中から17箇所の部分を見つけ、合計で983件の挿入をします。
これも、もっと件数が多いとか頻繁にこのような処理をするならば、自動化を考えるところですが、今回は手作業で行います。
処理速度がいくら早くても、総合時間で考えると「gawk」はテキスト加工においては圧倒的な能力をしまします。
VBAやPythonなどと比べてなにが圧倒的かと言うと、とっても深く考えられた「ルーズ」さだと思っています。
最近では、「ハッシュ」という言葉が結構使われるようになりましたが、いまから40年も前には「連想配列」とは言わず「ハッシュ」と言っていたように思います。
例えば前回書いた1400万件ですが、7列の集計に要した時間が57.42秒でしたので1列の集計なら8秒程度です(2軸のクロス集計なら12秒)。
お金をかければ1秒にすることも可能かもしれませんが、50年前のフリーソフトであるgawkなら5分か10分のスクリプト作成時間で実現できてしまいます。
これを「支店」ごととか、「商品」ごととか、あるいは「支店+商品」のように分散したテキストにしておけば、全体で1億や10億件程度なら、数分で集計できると思います。


考えなければならないのは、ユーザーインターフェースですね。「ビッグデータ」が新しい時代の幕開けのようなことを言っていましたが、アマゾンやグーグルを今更乗り越えることができるとは思えません。
「AI」も似たような騒がれ方をしていますが、今更北米に対抗できそうな気もしません。
しかし、凡庸なワタシの身の回りには究極なことばかりで埋め尽くされているわけでもないので、あまりトレンドに振り回されることは無用と思っていますが、そんなわけでトレンドからの乖離が大きくなっている気がします。
いまから、手作業しなければならないでの、今回はここで終わり。