Cygwin(bash)を使用して、複数のCSVファイルからフィールドを検索、グループ化、および計算するスクリプトを作成しています。各行にはカンマ区切りのフィールドがあり、それぞれ同様の規則に従います。数値、等号(=)、英数字の順です。 「(数字)=」は1行に表示されない場合があります。その場合、フィールドの位置は異なる場合がありますが、1行に1回のみ表示されます。また、等号の後の値の長さも異なります。
私の目標の例は最高です。 CSVファイル:
35=D,11=ABCD1,1=ABC,55=XYZ,38=100,40=P,18=M,54=1,59=0,10=111
35=D,11=ABCD2,1=ABC,55=XYZ,38=200,40=P,18=M,54=1,44=10.00,59=0,10=133
35=D,11=ABCD3,1=ABC,55=XYZ,38=300,40=P,18=M B,54=1,44=10.00,59=0,110=200,10=113
35=D,11=ABCD4,1=ABC,55=XYZ,38=400,40=P,18=M B F,54=1,44=10.00,59=0,110=300,10=144
35=D,11=ABCD5,1=ABC,55=ZYX,38=300,40=2,54=1,44=10.00,59=3,10=132
35=D,11=ABCD6,1=ABC,55=QQQ,38=100,40=1,18=C,54=2,59=3,10=131
「18=」フィールドの値はスペースで区切られます。それぞれの固有の「18 =」値を識別してから、各値の発生回数を計算するスクリプトまたは1行のコードが必要です。上記のファイルを使用した出力は次のとおりです(ソートはオプション)。
18=M 2
18=M B 1
18=M B F 1
18=C 1
前述のように、このスクリプトはこの形式のレコードを含む多くのファイルを読み取る必要があります。私はさまざまなgrep
組み合わせを試してみましたが、awk
正しい実装に慣れていません。
最初の2つの答えは実際に動作します(本当にありがとう!)。一意の「18 =」カウントの結果でグループ化された「38 =」値を集計するように拡張できますか?
ベストアンサー1
これはPerlでハッシュ構造を使用して行うのが最善です。
perl -nle '($x)=/(18=[^,]+)/;$y{$x}++; END{print "$_ $y{$_}" for keys %y}' files
説明する
各行に対して、Perlはカンマ18=
以外の文字をできるだけ多く見つけ、見つかった内容を変数に保存します$x
。その後、この変数はハッシュのキーとして使用され、見つかった各キーについて関連%y
する値が増加します。$x
最もEND
つまり、すべての行が処理された後)18=...
ハッシュ変数のキー(フィールド)と関連値(発生回数)を印刷します%y
。