csvファイルを解析して、列値の一致する文字セットに基づいて行をフィルタリングします。

csvファイルを解析して、列値の一致する文字セットに基づいて行をフィルタリングします。

次のcsvファイルを検討してください。

A,3300   
B,8440   
B,8443   
B,8444 
C,304
C,404  
M,5502   
M,5511

実際のcsvファイルはかなり大きい(約60,000行)。問題を説明するために小さなバージョンのみを提供しました。

2番目のフィールドに基づいて行をフィルタリングして、一致する文字セットを持つ行を単一の行にグループ化するスクリプトを作成する必要があります(2番目のフィールドを一致する文字セットに置き換えます)。

つまり、上記のcsvファイルでは、次の出力が期待されます。

A,3300   
B,844  
C,304
C,404 
M,55   

2番目のcsvフィールドの内容だけがスクリプトの目的に関連しています。したがって、他のフィールドで発生するすべての一致/不一致は、ファイル内のままでなければなりません。

これにawkは役に立ちますか?それとも別の組み込み機能がありますか?どんな助けでも大変感謝します。

ベストアンサー1

awk2つの文字列間の共通の開始文字を見つけるために小さな関数を作成しました。

awk '
BEGIN{OFS=FS=","}
function common_chars(a,b, o){
    split(a,asplit,"")
    split(b,bsplit,"")
    n=1
    while (asplit[n]==bsplit[n]){
        o=o""asplit[n]
        n++
    }
    return o
}
s[$1] {v[$1]=common_chars(v[$1],$2)}
!s[$1] {v[$1]=$2;s[$1]=1 }
END {for(a in v){print a,v[a]}}
' file

表示されない場合$1(状態はに保存されます)、配列にs[$1]保存されます。表示されている場合は、関数の戻り値をそれ自体と間に設定してください。この関数は、最初の文字で不一致が見つかるまで個々の文字に対してwhileループを実行します。$2v[$1]=$2v[$1]$2

forC,404そしてC,304それは印刷されますC,

出力:

A,3300   
B,844
C,
M,55

おすすめ記事