やりたいこと
lists.js と cats.js の二つのファイルを加工して、data1.txt と data2.txt にしてから、二つのファイルをデータベースの外部結合風に結合したい。
lists.js => data1.txt
cats.js => data2.txt
data1.txt
1,問い合わせ1,回答1 2,問い合わせ2,回答2 3,問い合わせ3,回答3 4,問い合わせ4,回答4 5,問い合わせ5,回答5
data2.txt
1,カテゴリー3 2,カテゴリー1 3,カテゴリー1 5,カテゴリー4
join
コマンドで結合。
bash
1$ join -t, -a1 -o auto -eNULL data1.txt data2.txt 21,問い合わせ1,回答1,カテゴリー3 32,問い合わせ2,回答2,カテゴリー1 43,問い合わせ3,回答3,カテゴリー1 54,問い合わせ4,回答4,NULL 65,問い合わせ5,回答5,カテゴリー4
lists.js
js
1const data = { 2 "lists" : [ { 3 "a" : "回答1", 4 "id" : "1", 5 "q" : "問い合わせ1" 6 }, { 7 "a" : "回答2", 8 "id" : "2", 9 "q" : "問い合わせ2" 10 }, { 11 "a" : "回答3", 12 "id" : "3", 13 "q" : "問い合わせ3" 14 }, { 15 "a" : "回答4", 16 "id" : "4", 17 "q" : "問い合わせ4" 18 }, { 19 "a" : "回答5", 20 "id" : "5", 21 "q" : "問い合わせ5" 22 }] 23}
lists.js => data1.txt
test.sh
bash
1#!/usr/bin/env bash 2sed -E '1,2d; s/(^[ \t]*|[ \t]*$)//g' lists.js | 3sed -z 's/}]\n}//' | 4awk -F, 'BEGIN{RS="}, {"} { 5 for(i=1; i<=3; i++) { 6 split($i,array,"\"") 7 $i=array[4] 8 } 9 print $2 "," $3 "," $1 10}' 11echo ${PIPESTATUS[@]} #パイプエラー確認
最初と最後の二行を削除、行頭と行末のスペースを削除してから、row
を改行ではなく、}, {
で区切ってグループ化しています。列の区切りは、,
です。
結果、
1,問い合わせ1,回答1 2,問い合わせ2,回答2 3,問い合わせ3,回答3 4,問い合わせ4,回答4 5,問い合わせ5,回答5 0 0 0
cats.js
js
1const data = { 2 "categories" : [ { 3 "c" : "カテゴリー1", 4 "id" : "1", 5 "lists_id" : "2 3" 6 }, { 7 "c" : "カテゴリー2", 8 "id" : "2", 9 "lists_id" : "" 10 }, { 11 "c" : "カテゴリー3", 12 "id" : "3", 13 "lists_id" : "1" 14 }, { 15 "c" : "カテゴリー4", 16 "id" : "4", 17 "lists_id" : "5" 18 }] 19}
cats.js => data2.txt
test2.sh
bash
1#!/usr/bin/env bash 2sed -E '1,2d; s/(^[ \t]*|[ \t]*$)//g' cats.js | 3sed -z 's/}]\n}//' | 4awk -F, 'BEGIN{RS="}, {"} 5{ 6 for(i=1; i<=3; i++) { 7 split($i,array,"\"" ) 8 $i=array[4] 9 } 10 split($3,array," ") 11 for(i in array) { 12 id_cat[array[i]]=$1 13 } 14 for(i in id_cat) { 15 print i "," id_cat[i] 16 } 17 delete id_cat 18}' | sort -t, -n 19echo ${PIPESTATUS[@]} #パイプエラー確認
結果、
bash
11,カテゴリー3 22,カテゴリー1 33,カテゴリー1 45,カテゴリー4 50 0 0 0
こちらもうまくいっているようですが、もっとシンプルに書けるのではないかと疑問に思っています。間違いや修正点、別の方法があればご教示お願いいたします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/14 03:08