csvファイル「sample.csv」に、以下のような内容が200万行以上書いてあります。容量にして50MB以上です。
csv
1id,name 2"A101","aaa" 3"A101","bbb" 4"B202","aaa" 5"B202","bbb" 6"B202","ccc" 7"C303","aaa" 8"C303","bbb" 9"C303","ccc" 10"C303","ddd"
この大容量のcsvを、項目「id」ごとにグループ分けして整形し、以下のように1行ずつ標準出力したいと考えています。
"id":"A101" "name":["aaa","bbb"] "id":"B202" "name":["aaa","bbb","ccc"] "id":"C303" "name":["aaa","bbb","ccc","ddd"]
出力結果がこのようになる処理をシェルスクリプトで記述したいのですが、どのように記述すると良いのでしょうか?
試したこと
シェルスクリプトに以下のように記述しました。
この記述方法ですと、数百KB程のcsvを読み取れることは確認できたのですが、
50MBになると何時間経っても処理が終わりませんでした。
shell
1data1=[$(awk -F, '(NR>1){r[$1]=r[$1] $2} 2 END{for(i in r) print "{\"id\": "i FS " " "\"name\": ["r[i]"]}"}' sample.csv)] 3 4data2=$(echo ${data1} | sed "s/\"\"/\", \"/g" | sed "s/} {/}, {/g") 5 6echo ${data2} | jq -c '.[]' | sed -E "s/,(.*[)/$(printf '\\012 ')\1/g" | sed "s/[\{\} ]//g]"
大容量のcsvでも処理できるようにするための方法をご教授いただけますと幸いです。
よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/06/18 16:35