シェルスクリプト総合 その30
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトに関する総合スレッドです。 全般 ・荒しは無視しましょう。 ・丁寧な姿勢を心掛けましょう。 ・ネチケット(死語)を意識しましょう。 前スレ: シェルスクリプト総合 その29 https://mevius.5ch.net/test/read.cgi/tech/1537540487/ paste コマンド使うとか。見づらいけどw $ paste -d '\n' file_a file_b 一旦質問を忘れて 同時に二つのファイルを開いて処理したい 他のスクリプト言語を使う方が幸せになれる様な気がする >>568 こんな奴に誰が答えたいと思うだろうか? POSIXシェルのみで全て書くという縛りプレイが好きなんだろうw POSIXは最低限のインターフェースを規格化しているだけで、結局はプラットフォーム別に書くしかないのが現状だからな bashがあるならbashで書けばいい GNU拡張が使えるなら使えばいい あるもんは使えばいいんだよ 可搬性の幻想に囚われると逆に生産性が落ちる >>570 そんなの何やりたいのかで答えは変わってくるだろ 漠然とした質問には漠然とした回答しか返ってこないぞ >>575 パソコンの大先生にありがち。知識は少しはあると自負のアンバランスからだな awk で丸飲みしちゃえ 1ファイル1配列 メモリ節約なら 1行ずつ読むのをシンクロさせる >>575 ほんとそれなw できるのに、知識ないやつほどぐだぐだとレスをする 答えられないのを質問者のせいにする exec 3<file1.txt exec 4<file2.txt read -r file1<&3 read -r file2<&4 echo "$file1 $file2" read -r file1<&3 read -r file2<&4 echo "$file1 $file2" ちなみに>>580 は 一回目のechoはファイルの1行目、 二回目のechoはファイルの2行目が ちゃんと表示されるからなw お前ら勉強してちゃんと質問に答えられるようになれよ 中途半端な知識で満足するな >>581 覚えたてで見てほしくてしようがないんだよ 生暖かい目で見守ろうやw などと、質問には答えずに それでも悔しいからか、レスだけはするようで すげえ嫌な感じの方法思い付いた。 まず二つのファイルの行数だけ wc -l で調べ、小さい方を max に入れておく。 n=1 にしてから max までループさせて、ループの中で awk を使って NR==$n の一行を双方のファイルから抜き出してそれぞれ別の変数に入れる。 なんてことをすると2つの(またはそれよりも多くの)ファイルから1行抜き出して何かをする事は可能だ。 しかし行が長くなればなるほど無駄な処理が増えて時間が掛かることは言うまでもない。 大変効率の悪い方法だ。 >>582 それやりたいなら普通はpaste使うけどな >>585 その効率の悪い方法を実装するとして、wcもawkもいらんのでは? 行数を数えるのも、特定の行を読み込むのもシェルスクリプトだけでできるし。 >>580 のやり方、同時に2つのファイルを開いて処理する方法で 実現できないような場合には使えるかも。ファイルのサイズが小さいなら問題にならないし >>586 あ、そうだね。 区切り文字とうするかだけの問題か。 >>586 > それやりたいなら普通はpaste使うけどな 残念ながらpasteでは自由な処理ができない 例えば、1つ目のファイルに書いてある命令を解釈しながら 2つ目のファイルを読み込んだり、他の処理をしたりとかね。 で、POSIXで簡単にできることを、答えられずに 他の言語でやれとか、自由な処理をしたいっていうのに それを理解しない答えを返してる奴ら 質問者の俺自身に、完璧な答えを出された気持ちはどう?w またいい問題を思いついたら、質問(?)してやるから じゃーねーw >>590 だからやりたいことを先に言えよ お前はシェルスクリプトの前に質問の仕方から勉強しろ >>593 同時に二つのファイルを開いて処理したい って言った。 処理の内容は自由に変えられる って言った。 同時に二つのファイルを開く以外のなにも条件として出してない それができれば、いろいろと応用が効く 特定のことしかできないdiffやpasteでは 処理の内容が変えられないだろ うーん、、、こんな感じ? $ paste -d '\n' file1 file2 | xargs -d '\n' -n 2 | sh file1 と file2 の内容例 file1: ==== ls cp mv ==== file2: ==== . x y y z ==== あー。「どうだ俺はこんなにできるんだすごいだろう」みたいな。 じゃあ本当にやりたかった事は複数ファイル処理ではなくて自分の能力自慢か。 人から認められて承認欲求を満たしたいってことでもあるかな。 いつも人からバカにされてるから何かで人をバカにしたいというのもあるかも知れない。 合掌。 >>598 後出し要件からするとそんな感じ また要件変わると思うw >>596 > なんで自分でわかるのに質問したのか謎 質問した時点では知らなかったよ?w >>598 後出しじゃない用件を言うと、 処理したい内容を自由に変えられないといけない 要件は同時に二つのファイルを開いて いろんな処理をしたいってことだけ ま、もう答えは出したがw >>599 最初に用件をちゃんといってるのに、例をいうとその例しかできない方法を出すし その質問にたいする曲解を潰していくうちに、その時間で自分で調べて解決できてしまうんだから どうしろっていうんだw やっぱ「自決しました」で終わらせたほうが良かったか? >>603 普通にわからなくて質問していてやがて自分でわかった場合、普通はそれまでに答えてくれた人に対するお礼をするしこういう方法で出来ましたと自分のやったことを書く。 君の場合なぜか答えてくれた人に対する感謝の念がない。書かれたことが間違いや見当外れのことであっても普通は書いてくれたというだけで感謝するものだ。 しないとするなら少なくともその質問は質問に偽装された何か別のものだ。 >>604 teratailとかSOで叩かれてこい >>605 いい加減、客様は神様です。はやめたほうが良いよw >>607 言っている意味がわからない。何か特殊な宗教でも信奉しているのかね? >>608 回答者のほうが偉いみたいな考え方。 質問者と回答者は対等です。 >>609 対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。 君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。 >>610 どうやら日本の礼儀が理解できないようだ 今問題になっている隣国の人間なんだろう 日本の礼儀と隣国の話しかできないのが世界が狭いよな >>611 何かを与えてくれたらお礼をするのは国に関係なくどこでも共通の礼儀だが、君はそれをしないばかりか与えてもらって当然と考えるとするならば、それは正に今の韓国と同じだね。 優遇して与えていた側に礼を言わないばかりか盗人猛々しいとでも言うかね? ということで、質問に対して 答えを返した俺に感謝しろ という話さ 俺は別に自決しましたで終わらせても良かったんだが、 俺ができるってことを示さなければ、 シェルスクリプトで同時に二つのファイルを開けるってことも 知らなかったんだろうな この先の人生、似たような問題に直面したとき、 今日の会話を思い出しながらも、なかったことにして 俺が回答したテクニックを使うのだろう >>615 質問者は君自信だ。それに関しては君が君に感謝すれば良い。他の人は少なくとも同じ質問はしていないのだから君に感謝する必要はない。 という、普通の事が君にはわからないのか?発達障害か何かか?だったらしょうがないから形だけ他の人を真似て合わせろ。そうすれば無用なトラブルは減らせる。 ん?他の人って会話に参加してる人だけのことだと思ってるのか? 検索で見つけた人とかあるだろう。 相変わらず視野が狭いんだな。 検索した人は俺に感謝する。ここでレスしてたやつも同じ問題がでたとき 嫌々ながら俺に感謝する。ウィン♪ウィン♪ってやつではないか どうでもいいけどアレを「完璧な回答」とか言ってる時点でお察しw ファイルディスクリプタを使った方法にはPOSIXの範囲では解決できない重大な落とし穴がある。 まあ態々言わなくても分かるだろうから,明言はしないがw ああ一応分からん人の為にヒントをいうと,実は2018年あたりの過去スレで言及してる。 ※その落とし穴がなんなのか言わないのは、わからん人のためよりも 俺に意地悪をすることを選んだから。結局それがそいつの本性なんだよ。 {{"item1":["key1":"value1"]},{"item2":["key2":"value2"]}} {{"item1":["key1":"value1"]}} {} {{"item1":["key1":"value1"]},{"item2":["key2":"value2"]},{"item3":["key3":"value3"]}} みたいに中途半端なjsonがたくさん混ざっているファイルを item1,item2,item3 value1,value2, value1,, ,, value1,value2,value3 のような綺麗なcsvで出力する方法ってありますか? jqコマンドを使っても上手くいかず…… >>629 それ中途半端なjsonじゃねーよ jsonlという形式だ。jsonエル 1行ずつループで回してもできそうだが、なんどもjqコマンドを呼び出すことになって 時間がかかりそうだから、 [ 1行目 , 2行目 , 3行目 , 4行目 ] みたいに変換して、jq一発にしたほうが速いだろうな。 そのやり方は、俺以外でも答えられるやろ? >>629 GNU awk 4.0.0 以降で $ gawk -ijoin -vFPAT='"[^"]+"' '{ for(i=1;i<=NF;i+=3){ item[$i]=1 row[NR,$i]=$(i+2) } }END{ for(i in item){x[n++]=i} n-- print join(x,0,n,",") for(i=1;i<=NR;i++){ k=0 for(j in x){ r[k++]=row[i,x[j]] } print join(r,0,n,",") } }' data.jsonl これは、Ruby で、JSON.parse できない。 何や、この形式は? {"item1":["key1":"value1"]} [ ] の中に、{ } を入れたら、OK だが、 {"item1":[{"key1":"value1"}]} https://jsonformatter.curiousconcept.com/ このサイトで、JSON の形式が正しいかどうかチェックしたら、エラーになった! {"item1":["key1":"value1"]} Error:Expecting comma or ], not colon. >>632 すげえ! 口先だけの>>631 とは全然違うわw >>629 {{"item1":["key1":"value1"]}} じゃなくて {{"aaaa":["bbbb":"cccc"]}} でも "cccc" って表示されるけどOK? あと {{"item1":["key1":"val\"ue1"]}} みたいに " がデータに入ってる場合はあるの? それと key1、key2、key3 ってキー名が変わるのは正しいの? jsonlとしても正しくないけど、書き間違いじゃないの? >>629 これJSONじゃないしフォーマットおかしいってだけじゃね? 正しいJSONならjqだけでcsv変換できるぞ JavaScript で、: は、オブジェクトの属性だろ。 だから、{ } 内でしか使えない だから、1 はダメで、2, 3 はOK 1. {"item1":["key1":"value1"]} 2.1 {"item1":["value1"]} 2.2 {"item1":["key1","value1"]} 3. {"item1":[{"key1":"value1"}]} フォーマットが不自然なんだよな。独自フォーマットなら その仕様を言ってくれないと答えようがない。 例えば、そこに書いてあるキー以外も存在するのか?とか 改行はどうなってるのかとか >>629 は「中途半端なjson」と言ってるから分かってる気はするけど、 半可通な上司か先輩がJSONを分かったつもりになってるだけで 仕様なんかちゃんと考えて無いと思うなw 本物のjsonにしちゃえ 独自フォーマットする利点ないでしょ 独自形式など、作るだけ無駄 パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ! 昨日質問したものですが中途半端に書いてしまい申し訳ありませんでした まだ勉強不足の学生でして…… こっちが正しいjsonと出力させたい内容です {"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}} {"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}} {} {"aaa":{"bbb":["ccc"]}} ↓ aaa,xxx,あああ ccc,zzz,いいい ccc,zzz, ,, ccc,, aaa,xxx,あああ ccc,zzz,ううう ccc,zzz, ,, ccc,, です 連レスすみません 例えばaaaとあああだけ抜き取りたい場合 さきほどのjsonlから aaa,あああ ccc,ううう ccc, , ccc, と表示させる方法も知りたいです。 全部表示させた後にawkで削除した方がいいのでしょうか? >>643 学生なら先生に聞けばいいじゃん。 宿題?それでも先生に聞いていいんだよ。 まあ、ここでは丁度良いお題にもなるから良いかも知れないが、宿題の提出期限とかそちらの都合は無視されるよ。 >>646 $ ... | cut -d, -f1,3 >>646 もとのデータが悪かっただけ。 jsonlだったらjqで普通に扱える。 echo "aaa,xxx,あああ"; jq -r '[.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]] | @csv' data.jsonl ダブルクォートがいらないなら、@csvをjoin(",")にする こことか見れば良い https://medium.com/veltra-engineering/jq-supports-json-to-csv-fb5c951a9575 >>650 おおおおお!!!ありがとうございます!!! 自分がやったときは完全一致してないとエラーが起きてましたのでありがたいです 今後はROMってもっと勉強します なるほどjqコマンドだけでやるにはこうすればいいのか jq -r -s '["aaa","xxx","あああ"], (.[] | [.aaa.bbb[0], .xxx.yyy[0], ."あああ"."いいい"[0]]) | @csv' data.jsonl 今調べてみたら .aaa.bbb[]と入力していたので全部一致してないとエラーになってたっぽいです .aaa.bbb[0]に変えている>>650 では一致してないところも空欄で出力されてましたので求めるものでした >>653 もしかして皮肉という概念をご存知ない…? >>655 それ配列ってことは要素数が1以上の場合もあるわけだよね 先頭だけでいいの? >>658 問題ないならいいけど [0] より []? 使ったほうが良いよ bashって可変長引数で綺麗に処理できないの? bash test.sh a b c d e って打ったら xaz,xbz,xcz,xdz,xez bash test.sh a b c って打ったら xaz,xbz,xcz って出るものを作りたいんだが$@を使って色々やっても xa b c d ez, って出力しかできぬ >>660 あんたが可変長引数を綺麗に勝利できないだけ printf '%s,' a b c a,b,c, printf 'x%sz,' a b c d e xaz,xbz,xcz,xdz,xez, >>660 while [ $# -gt 0 ]; do printf x printf $1 printf "z\n" shift done sh multi_arg.sh a b c d e xaz xbz xcz xdz xez \nいらなかったな あと間に,でやるやつ必要か そのへんpass ぶっちゃけ $@ を使ってどうやれば xa b c d ez, が出せるんだろうって悩むレベルw $ set -- {a..e} $ l=;for v in "$@";do l="${l}${l:+,}${v}";done;echo "$l" for 文で "in" を省略すると "$@" が対象になるので $ l=;for v;do l="${l}${l:+,}${v}";done;echo "$l" としても可。 いけね、x と z で挟むの忘れてたわ $ l=;for v;do l="${l}${l:+,}x${v}z";done;echo "$l" >>660 や これを1まとめの変数にする方法ってあるか? bash test.sh a b c d って打つと↓を変数で使えるようにしたい(最後だけ,を外して) xaz,xbz,xcz,xdz ループさせて配列に入れて${test[@]}でxaz,xbz,xcz,xdz, って出力させることならできたけど最後の,が邪魔で仕方ない > これを1まとめの変数にする方法ってあるか? あるに決まってるだろ。 自分でやり方を模索しろや > 最後の,が邪魔で仕方ない ならつかないようにするか消せばいいだけだろ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる