csvファイルでフィールドパターンを見つけて、一意のフィールド値を計算します。

csvファイルでフィールドパターンを見つけて、一意のフィールド値を計算します。

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

おすすめ記事