質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

233閲覧

Bash でデータファイル加工・結合 awk join など

tanaka_z

総合スコア2

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

0クリップ

投稿2024/02/13 01:16

やりたいこと

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

こちらもうまくいっているようですが、もっとシンプルに書けるのではないかと疑問に思っています。間違いや修正点、別の方法があればご教示お願いいたします。

melian👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下は jq コマンドを利用する場合です。

jq

1jq -r -n --slurpfile cats <(echo {; sed 1d cats.js) ' 2 ( 3 $cats[] | .categories | 4 map(select(.lists_id != "") | .c as $c | 5 .lists_id | split(" ") | map({idx: ., category: $c})) | 6 flatten 7 ) as $catg | 8 INDEX($catg[]; .idx) as $catg_idx | 9 inputs | .lists[] | 10 [.id, .q, .a, $catg_idx[.id].category // "NULL"] | join(",") 11' <(echo {; sed 1d list.js)

投稿2024/02/13 05:55

編集2024/02/13 14:57
melian

総合スコア19825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanaka_z

2024/02/14 03:08

jq コマンドすごく良いです。 こんな便利なコマンドがあることを知りませんでした。 提示してくださったコードも大変勉強になりました。 有益なご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問