次の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
awk
2つの文字列間の共通の開始文字を見つけるために小さな関数を作成しました。
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ループを実行します。$2
v[$1]=$2
v[$1]
$2
forC,404
そしてC,304
それは印刷されますC,
出力:
A,3300
B,844
C,
M,55