Scrapboxのjsonから文字数の分布を可視化する
のりしろ
結論
基素.icon
以下のフォーマットのjsonに対してjqを使ってlines要素のそれぞれの文字列カウントをするzshで動くワンライナーを書いてください code:zsh
{"name":"motoso","displayName":"基素基","exported":1678366154,"pages":[
{"title":"静電気","created":1670703682,"updated":1678360502,"id":"6394e9df54326b001e527fdd","lines":["静電気","https://guard.lion.co.jp/eleguard/coordinate/","https://gyazo.com/620808bd024d650421fa02cf22ac6ec3","","アクリルとナイロンが混じってる服が帯電するのはこのせいか","","それぞれの極性に帯電しやすい物質の順番を示した帯電列","https://www.achilles.jp/product/electronics/knowledge/static-electricity/#:~:text=物質によってプラスに帯電,ということになります%E3%80%82","https://gyazo.com/3137ff28d09f699d16e780b1ddace87d","",""]}, {"title":"公開読書","created":1678354135,"updated":1678354410,"id":"6409a6d4a45c78001cfb51ab","lines":["公開読書","読書の感想文や自分の言葉でのまとめを公開でやる読書"," ここで公開とは、他人の意見がもらえる場所=他人の目につく場所ってこと","ねらい"," インターネットは他人が自分の誤解を訂正してくれるかもしれない"," 口コミで他人が興味を持ってその本を買えば著者にも還元される","","アクティブ読書のように著作物をそのまま掲載はしない"," 引用の要件を満たせない"," 自分がされたら嫌だ",""]}, ]}
`
ただし、linesの各要素の文字列は1つに結合してください
ChatGPT.icon
cat data.json | jq -r '.pages[].lines | map(select(. != "")) | join(" ")' | wc -w
cat data.jsonでjsonファイルを読み込みます。
jq -r '.pages[].lines | map(select(. != "")) | join(" ")'で、各ページのlines要素を取得し、空文字列を除外して、それぞれの文字列を半角スペースで結合します。ここで、-rオプションを指定することで、文字列を生の形式で出力します。
wc -wで、全体の単語数を数えます。これにより、各ページのlines要素の文字列カウントが求められます。
これだと全部になっちゃうので1行ごとにカウントしてほしい基素.icon
$ cat data.json | jq -r '.pages[].lines | map(select(. != "")) | map(length) | @csv' | sed 's/"//g'
うーん。これだと各要素が結合されないぞ基素.icon
基素.icon各lines要素は結合した上で文字数を数えてください
ChatGPT.icon
$ cat data.json | jq -r '.pages[].lines | map(select(. != "")) | join("") | length'
良さそう基素.icon
基素.iconこれらで得られた文字数のヒストグラムをshellに出したいです。区間は1000ごとにしてください。ワンライナーでお願いします
ChatGPT.icon
$ cat data.json | jq -r '.pages[].lines | map(select(. != "")) | join("") | length' | awk '{xint($1/1000)++} END {for (i in x) {printf "%d-%d: %d\n", i*1000, (i+1)*1000-1, xi}}' | sort -n 分布を見た感想基素.icon
69000文字以上の記事がある...なに?
minifyしたコードかな?
0.2%ぐらいが8000字を超える