X



シェルスクリプト総合 その30

■ このスレッドは過去ログ倉庫に格納されています
0544デフォルトの名無しさん
垢版 |
2019/08/05(月) 14:55:51.10ID:uR0Am4u5
なんであるものを使わないんだろう
二段階認証おじさんみたいな頭の構造なんだろうか
0545デフォルトの名無しさん
垢版 |
2019/08/05(月) 15:27:49.43ID:MNXFY7cg
> なんであるものを使わないんだろう
書いたでしょ? tputコマンドがない環境が現実としてある。
0546デフォルトの名無しさん
垢版 |
2019/08/05(月) 15:54:00.38ID:MNXFY7cg
簡単なスクリプトを書いて、とりあえずcolsについて
データベースに登録されてる1700端末をすべて調べてみたが
すべてが 0x31 0x33 0x31 0x0a だった

boldだと非対応を除いて892端末。44パターン。結構違いがあるな
setafだと340端末、11パターン

まあtputを使うほうが楽だってのはわかるけど、エスケープシーケンスが違うのは
マイナー端末だろうし、数の割にパターン数は限られているので
完璧を求めたいなら別だけど使う環境で動けば良いわけで、tputを使用するのは過剰な気がするな。
0548デフォルトの名無しさん
垢版 |
2019/08/05(月) 16:04:49.48ID:MNXFY7cg
む、/lib/terminfo/ 以下にも定義ファイルがあるのか
xterm-256colorがないのに使えると思ったら
まあ +40個しか変わらんけど
0552デフォルトの名無しさん
垢版 |
2019/08/05(月) 18:58:04.34ID:7Al1V6ob
シェルスクリプトマスターの皆様
xxxxNN.txtというファイルが大量にあります(xxxxの部分はファイル名、NNの部分は0〜99の連番)
NNの部分が50未満ならxxxx50.txtにNNが50以上ならxxxx99.txtに一括でリネームしたいのですがやり方教えてください
0555デフォルトの名無しさん
垢版 |
2019/08/05(月) 19:19:16.45ID:MNXFY7cg
無理に頭の体操的なことをせずに、こんな感じでいいでしょ?

for file in *; do
 name=${file%[0-9]}
 name=${name%[0-9]}
 num=${file#$name}
 [ $num -lt 50 ] && num=50 || num=99
 mv "$file" "$name$num"
done
0558デフォルトの名無しさん
垢版 |
2019/08/05(月) 21:05:22.75ID:O6CFE/yb
>>552
ファイル名に数字がまざってなければ
例ば[a-zA-Z]だったら
dry run は
| perl -pe 's{ \d+ }{ $& < 50 ? 50 : 99 }ex'
0559デフォルトの名無しさん
垢版 |
2019/08/06(火) 08:47:13.20ID:fNxvG1AN
ほとんど気にすることないと思うんだけどさ
みなさんが今まで携わってきたシステムでshが/bin/shにないシステムってあった?
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html
ここによると/bin/shは既定されてない→つまり必ずしもあるとは限らない
みたいなんだけど、そんなシステムあるかね?

Solarisとかなら…と思ったけど/bin/shだったし。
0562デフォルトの名無しさん
垢版 |
2019/08/06(火) 10:27:23.06ID:9obbnMlM
Androidの環境ってよくわからん。
busyboxは採用して無くて、昔はtoolboxだったのが今はtoyboxを採用している。
しかしtoyboxのシェルであるtoyshは完成して無くてmkshを使っている。
という理解であってるんだろうか?
dockerfileないんかな?
0563デフォルトの名無しさん
垢版 |
2019/08/06(火) 17:00:21.88ID:g73t6D+3
Androidはヘッドレスでは立ち上がらんのじゃね?
昔見た限りだとinitスクリプト中でコケるんじゃないかと
0565デフォルトの名無しさん
垢版 |
2019/08/07(水) 01:43:15.26ID:WK8NJ3/V
diffみたいに二つのファイルを開いて、一行ずつ交互に比較できないかな?
bash依存禁止で
0566デフォルトの名無しさん
垢版 |
2019/08/07(水) 01:49:50.14ID:r57RWdCS
diff使えばいいじゃん
0567デフォルトの名無しさん
垢版 |
2019/08/07(水) 01:57:20.41ID:QJETJeRx
diff のアルゴリズムは有名だから
あとはもっと具体的にどうさせたいのかによりそう
0576デフォルトの名無しさん
垢版 |
2019/08/07(水) 06:41:35.91ID:5FNsDR6i
POSIXシェルのみで全て書くという縛りプレイが好きなんだろうw
POSIXは最低限のインターフェースを規格化しているだけで、結局はプラットフォーム別に書くしかないのが現状だからな
bashがあるならbashで書けばいい
GNU拡張が使えるなら使えばいい
あるもんは使えばいいんだよ
可搬性の幻想に囚われると逆に生産性が落ちる
0577デフォルトの名無しさん
垢版 |
2019/08/07(水) 06:56:03.49ID:5FNsDR6i
>>570
そんなの何やりたいのかで答えは変わってくるだろ
漠然とした質問には漠然とした回答しか返ってこないぞ
0579デフォルトの名無しさん
垢版 |
2019/08/07(水) 08:36:36.73ID:QJETJeRx
awk で丸飲みしちゃえ
1ファイル1配列

メモリ節約なら
1行ずつ読むのをシンクロさせる
0580デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:22:21.65ID:WK8NJ3/V
>>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"
0582デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:31:15.75ID:WK8NJ3/V
ちなみに>>580
一回目のechoはファイルの1行目、
二回目のechoはファイルの2行目が
ちゃんと表示されるからなw

お前ら勉強してちゃんと質問に答えられるようになれよ
中途半端な知識で満足するな
0585デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:41:40.99ID:9POPBXN5
すげえ嫌な感じの方法思い付いた。

まず二つのファイルの行数だけ wc -l で調べ、小さい方を max に入れておく。
n=1 にしてから max までループさせて、ループの中で awk を使って NR==$n の一行を双方のファイルから抜き出してそれぞれ別の変数に入れる。

なんてことをすると2つの(またはそれよりも多くの)ファイルから1行抜き出して何かをする事は可能だ。
しかし行が長くなればなるほど無駄な処理が増えて時間が掛かることは言うまでもない。
大変効率の悪い方法だ。
0587デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:48:48.99ID:WK8NJ3/V
>>585
その効率の悪い方法を実装するとして、wcもawkもいらんのでは?
行数を数えるのも、特定の行を読み込むのもシェルスクリプトだけでできるし。

>>580のやり方、同時に2つのファイルを開いて処理する方法で
実現できないような場合には使えるかも。ファイルのサイズが小さいなら問題にならないし
0588デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:48:50.45ID:9POPBXN5
>>580
おお。それでできるな。
0589デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:51:13.86ID:9POPBXN5
>>586
あ、そうだね。
区切り文字とうするかだけの問題か。
0590デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:53:37.08ID:WK8NJ3/V
>>586
> それやりたいなら普通はpaste使うけどな
残念ながらpasteでは自由な処理ができない

例えば、1つ目のファイルに書いてある命令を解釈しながら
2つ目のファイルを読み込んだり、他の処理をしたりとかね。
0591デフォルトの名無しさん
垢版 |
2019/08/07(水) 11:56:37.01ID:WK8NJ3/V
で、POSIXで簡単にできることを、答えられずに
他の言語でやれとか、自由な処理をしたいっていうのに
それを理解しない答えを返してる奴ら
質問者の俺自身に、完璧な答えを出された気持ちはどう?w
0594デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:00:28.63ID:WK8NJ3/V
>>593
同時に二つのファイルを開いて処理したい
って言った。
処理の内容は自由に変えられる
って言った。

同時に二つのファイルを開く以外のなにも条件として出してない
それができれば、いろいろと応用が効く

特定のことしかできないdiffやpasteでは
処理の内容が変えられないだろ
0596デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:04:06.23ID:9POPBXN5
>>591
なんで自分でわかるのに質問したのか謎
0598デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:08:56.79ID:fPg/gK/3
うーん、、、こんな感じ?

$ paste -d '\n' file1 file2 | xargs -d '\n' -n 2 | sh

file1 と file2 の内容例

file1:
====
ls
cp
mv
====

file2:
====
.
x y
y z
====
0599デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:15:06.92ID:9POPBXN5
あー。「どうだ俺はこんなにできるんだすごいだろう」みたいな。
じゃあ本当にやりたかった事は複数ファイル処理ではなくて自分の能力自慢か。
人から認められて承認欲求を満たしたいってことでもあるかな。
いつも人からバカにされてるから何かで人をバカにしたいというのもあるかも知れない。
合掌。
0602デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:19:12.78ID:WK8NJ3/V
>>598
後出しじゃない用件を言うと、
処理したい内容を自由に変えられないといけない

要件は同時に二つのファイルを開いて
いろんな処理をしたいってことだけ

ま、もう答えは出したがw
0603デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:21:45.21ID:WK8NJ3/V
>>599
最初に用件をちゃんといってるのに、例をいうとその例しかできない方法を出すし
その質問にたいする曲解を潰していくうちに、その時間で自分で調べて解決できてしまうんだから
どうしろっていうんだw
0605デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:32:00.78ID:9POPBXN5
>>603
普通にわからなくて質問していてやがて自分でわかった場合、普通はそれまでに答えてくれた人に対するお礼をするしこういう方法で出来ましたと自分のやったことを書く。
君の場合なぜか答えてくれた人に対する感謝の念がない。書かれたことが間違いや見当外れのことであっても普通は書いてくれたというだけで感謝するものだ。
しないとするなら少なくともその質問は質問に偽装された何か別のものだ。
0608デフォルトの名無しさん
垢版 |
2019/08/07(水) 12:42:23.91ID:9POPBXN5
>>607
言っている意味がわからない。何か特殊な宗教でも信奉しているのかね?
0610デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:00:34.72ID:9POPBXN5
>>609
対等じゃないよ。金を出す側と受け取る側と同じだもの。同じわけがないじゃん。
君はなんでそんな現実と食い違う思想を持ってるんだ?それでは人とのトラブルになるだけで世の中渡っていけんだろう。
0613デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:27:24.72ID:9POPBXN5
>>611
何かを与えてくれたらお礼をするのは国に関係なくどこでも共通の礼儀だが、君はそれをしないばかりか与えてもらって当然と考えるとするならば、それは正に今の韓国と同じだね。
0614デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:29:19.39ID:9POPBXN5
優遇して与えていた側に礼を言わないばかりか盗人猛々しいとでも言うかね?
0617デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:39:19.49ID:WK8NJ3/V
俺は別に自決しましたで終わらせても良かったんだが、
俺ができるってことを示さなければ、
シェルスクリプトで同時に二つのファイルを開けるってことも
知らなかったんだろうな
0619デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:46:29.59ID:WK8NJ3/V
この先の人生、似たような問題に直面したとき、
今日の会話を思い出しながらも、なかったことにして
俺が回答したテクニックを使うのだろう
0620デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:49:03.15ID:9POPBXN5
>>615
質問者は君自信だ。それに関しては君が君に感謝すれば良い。他の人は少なくとも同じ質問はしていないのだから君に感謝する必要はない。

という、普通の事が君にはわからないのか?発達障害か何かか?だったらしょうがないから形だけ他の人を真似て合わせろ。そうすれば無用なトラブルは減らせる。
0621デフォルトの名無しさん
垢版 |
2019/08/07(水) 13:51:39.12ID:WK8NJ3/V
ん?他の人って会話に参加してる人だけのことだと思ってるのか?
検索で見つけた人とかあるだろう。
相変わらず視野が狭いんだな。
0622デフォルトの名無しさん
垢版 |
2019/08/07(水) 14:04:14.01ID:WK8NJ3/V
検索した人は俺に感謝する。ここでレスしてたやつも同じ問題がでたとき
嫌々ながら俺に感謝する。ウィン♪ウィン♪ってやつではないか
0623デフォルトの名無しさん
垢版 |
2019/08/07(水) 14:08:05.92ID:9POPBXN5
>>621
おだいじに。
0624デフォルトの名無しさん
垢版 |
2019/08/07(水) 14:09:22.96ID:9POPBXN5
夏の暑さも酷なことをするもんだ。
0626デフォルトの名無しさん
垢版 |
2019/08/07(水) 15:11:31.23ID:3XS5MIC7
どうでもいいけどアレを「完璧な回答」とか言ってる時点でお察しw
ファイルディスクリプタを使った方法にはPOSIXの範囲では解決できない重大な落とし穴がある。
まあ態々言わなくても分かるだろうから,明言はしないがw
0627デフォルトの名無しさん
垢版 |
2019/08/07(水) 15:23:56.01ID:3XS5MIC7
ああ一応分からん人の為にヒントをいうと,実は2018年あたりの過去スレで言及してる。
0628デフォルトの名無しさん
垢版 |
2019/08/07(水) 18:34:55.40ID:WK8NJ3/V
※その落とし穴がなんなのか言わないのは、わからん人のためよりも
俺に意地悪をすることを選んだから。結局それがそいつの本性なんだよ。
0629デフォルトの名無しさん
垢版 |
2019/08/07(水) 19:38:28.14ID:DcvmRDxD
{{"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コマンドを使っても上手くいかず……
0631デフォルトの名無しさん
垢版 |
2019/08/07(水) 19:46:34.34ID:WK8NJ3/V
1行ずつループで回してもできそうだが、なんどもjqコマンドを呼び出すことになって
時間がかかりそうだから、
[
1行目 ,
2行目 ,
3行目 ,
4行目
]

みたいに変換して、jq一発にしたほうが速いだろうな。
そのやり方は、俺以外でも答えられるやろ?
0632デフォルトの名無しさん
垢版 |
2019/08/07(水) 22:04:49.28ID:fPg/gK/3
>>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
0633デフォルトの名無しさん
垢版 |
2019/08/08(木) 02:47:04.99ID:/tBUMiMq
これは、Ruby で、JSON.parse できない。
何や、この形式は?
{"item1":["key1":"value1"]}

[ ] の中に、{ } を入れたら、OK だが、
{"item1":[{"key1":"value1"}]}
0634633
垢版 |
2019/08/08(木) 03:01:29.15ID:/tBUMiMq
https://jsonformatter.curiousconcept.com/

このサイトで、JSON の形式が正しいかどうかチェックしたら、エラーになった!

{"item1":["key1":"value1"]}
Error:Expecting comma or ], not colon.
0636デフォルトの名無しさん
垢版 |
2019/08/08(木) 06:10:00.05ID:l7k6B2kQ
>>629
{{"item1":["key1":"value1"]}}
じゃなくて
{{"aaaa":["bbbb":"cccc"]}}
でも
"cccc" って表示されるけどOK?

あと {{"item1":["key1":"val\"ue1"]}}
みたいに " がデータに入ってる場合はあるの?

それと key1、key2、key3 ってキー名が変わるのは正しいの?

jsonlとしても正しくないけど、書き間違いじゃないの?
0637デフォルトの名無しさん
垢版 |
2019/08/08(木) 07:06:18.58ID:DLp++heI
>>629
これJSONじゃないしフォーマットおかしいってだけじゃね?
正しいJSONならjqだけでcsv変換できるぞ
0638633
垢版 |
2019/08/08(木) 07:20:32.75ID:/tBUMiMq
JavaScript で、: は、オブジェクトの属性だろ。
だから、{ } 内でしか使えない

だから、1 はダメで、2, 3 はOK

1. {"item1":["key1":"value1"]}

2.1 {"item1":["value1"]}
2.2 {"item1":["key1","value1"]}

3. {"item1":[{"key1":"value1"}]}
0639デフォルトの名無しさん
垢版 |
2019/08/08(木) 07:25:15.97ID:l7k6B2kQ
フォーマットが不自然なんだよな。独自フォーマットなら
その仕様を言ってくれないと答えようがない。
例えば、そこに書いてあるキー以外も存在するのか?とか
改行はどうなってるのかとか
0640デフォルトの名無しさん
垢版 |
2019/08/08(木) 09:21:44.35ID:rLFqUIXU
>>629は「中途半端なjson」と言ってるから分かってる気はするけど、
半可通な上司か先輩がJSONを分かったつもりになってるだけで
仕様なんかちゃんと考えて無いと思うなw
0642デフォルトの名無しさん
垢版 |
2019/08/08(木) 11:39:13.74ID:/tBUMiMq
独自形式など、作るだけ無駄

パーサーを作るにも、特殊文字のエスケープ処理など、バグが増えるだけ!
0643デフォルトの名無しさん
垢版 |
2019/08/08(木) 11:47:10.43ID:FeKpuToe
昨日質問したものですが中途半端に書いてしまい申し訳ありませんでした
まだ勉強不足の学生でして……
こっちが正しいjsonと出力させたい内容です

{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]},"あああ":{"いいい":["ううう"]}}
{"aaa":{"bbb":["ccc"]},"xxx":{"yyy":["zzz"]}}
{}
{"aaa":{"bbb":["ccc"]}}



aaa,xxx,あああ
ccc,zzz,いいい
ccc,zzz,
,,
ccc,,
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況