シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
115デフォルトの名無しさん
2019/12/03(火) 08:29:02.93ID:ujGDA/f+ なんかかえってめんどくさいことしてんな。perlでめんどくさく書きたいだけ?
116デフォルトの名無しさん
2019/12/03(火) 08:29:47.31ID:ujGDA/f+ perlではなくrubyか。しつれい
117113
2019/12/03(火) 09:46:02.07ID:v9g/lO5M mv を作った奴は、頭おかしいw
dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから
漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数
それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
dest が存在するときは移動になり、
存在しないときは名前の変更になるという、極めて難しい場合分けが必要だから
漏れらが欲しいのは、
rename だけする関数と、移動するだけの関数の、2つに分かれている関数
それが分かれていないから、自分で処理を分けて、
かなりチェックしないと、バグってしまう
118デフォルトの名無しさん
2019/12/03(火) 12:17:58.24ID:5ZiHQIvd つまり自分に都合が悪い仕様=バグ
119デフォルトの名無しさん
2019/12/03(火) 12:28:33.61ID:Uh1tIUQA 一括リネームってたいてい複雑になるから
GUIツールを使ったほうが良いと思うんだよね
Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html
GUIツールを使ったほうが良いと思うんだよね
Windows 10版のPowerToysにリネーム機能が追加
https://pc.watch.impress.co.jp/docs/news/1215602.html
120デフォルトの名無しさん
2019/12/03(火) 18:09:42.76ID:+zVWCKlo >>112
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item 〜 メッセージは単なる目安
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"
[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}
mv "$item" "$dir/$newname"
done)
Fix(IFS文字が頭と末尾にある場合。dirname,basenameにしたのは気分)&Variation
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
mv "$item" "$(dirname "$item")/$(basename "$item" | tr ' ()' '_')"
done)
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="$(dirname "$item")"; newname="$(basename "$item" | tr ' ()' '_')"; newpath="$dir/$newname"
[ ! -e "$newpath" ] && mv "$item" "$newpath" || echo "can't rename $item, exists $newname" >&2
done
# can't rename $item 〜 メッセージは単なる目安
find . -name '*[ ()]*' -print | sort -r | (IFS=''; while read item; do
dir="${item%/*}"; newname="$(tr ' ()' '_' <<< ${item##*/})"
[ -e "$dir/$newname" ] && {
name="${newname%.*}_"
ext="${newname#*.}"; [ "$ext" = "$newname" ] && ext='' || ext=".$ext"
while [ -e "$dir/$name$ext" ]; do
name+='_'
done
newname="$name$ext"
}
mv "$item" "$dir/$newname"
done)
121デフォルトの名無しさん
2019/12/03(火) 18:14:03.14ID:+zVWCKlo122デフォルトの名無しさん
2019/12/03(火) 18:30:56.19ID:HnkJN8FN >>111
rename自体がperlだしちゃんと試行もあるけど
rename自体がperlだしちゃんと試行もあるけど
123デフォルトの名無しさん
2019/12/03(火) 19:27:45.48ID:mUaHu9IR124デフォルトの名無しさん
2019/12/03(火) 19:44:49.63ID:R2wB6lmg Linuxディストリによっては標準で入っている、perlスクリプトで作られたrenameコマンドのことだろ
125デフォルトの名無しさん
2019/12/03(火) 20:48:36.39ID:jDo5c24e renameは標準で入ってないとはいえ
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
テスト無しの自作コードでやるような処理じゃないやろ
find -depth -exec rename -nでdry-runしてから-n消せばいい
126デフォルトの名無しさん
2019/12/03(火) 21:32:10.96ID:yTVXI633 話のネタから外れて何を主張したいのだか
127デフォルトの名無しさん
2019/12/03(火) 22:25:15.93ID:yTVXI633 dry-runって言っても結局ひとつをrename/mvするその時点での状態でしか判断してないし、mvコマンドの前にecho付けるのと何が違うのだか
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか
>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
[ "$1" = "-n" ] && nac=echo || nac=''
$nac mv ...
でスイッチにしたけりゃ同じようにできるだろし
極めて難しいらしいことも結局時点での存在チェックしてるだけで、シェルスクリプトでtestを使うのと何がそうも極めて難しいほど違うのか
>>122
既に存在してたらエラー(オプションによって強行もできる)でもあるよね
The original C<rename> did not check for the existence of target filenames,
so had to be used with care. I hope I've fixed that (Robin Barker).
って、わざわざコメント書くようにな目玉なw
どのバージョンを使ってるのかわからんけど、パッケージによってはものすごいオプション拡張されたのが使われてるねえ
128113
2019/12/03(火) 23:09:51.48ID:v9g/lO5M Windows10, WSL, Ubuntu 16.04 にも、/usr/bin/rename がある
この手の処理の何がヤバイかと言うと、
例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている
データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく
すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
この手の処理の何がヤバイかと言うと、
例えば、3つ目の処理で、エラーが出ると、
2つ目までは、変更されてしまっているから、
そこから再実行すると、最初から実行していた時と、初期条件が変わっている
データベースと同じで、一部分だけ更新されたような、中途半端な状態になってはいけない(一貫性)。
エラー時には、すべてをロールバックするべき。
または、全体のバックアップを取っておく
すべてを更新するか、すべてをロールバックするのどちらかの状態だけにする
129デフォルトの名無しさん
2019/12/03(火) 23:14:22.94ID:50yNXJCt 自作コードがそれ以下なのになにを言っているのだか
130デフォルトの名無しさん
2019/12/04(水) 00:03:09.04ID:LOcDYH/A >>108
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。
$ find a
a
a/a (0)
a/a (0)/a (00)
a/a (0)/a (01)
a/a (1)
a/a (1)/a (11)
a/a (1)/a (10)
$ find b
b
$ cd a
$ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");'
$ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");'
$ cd ..
$ find b
b
b/a__1_
b/a__1_/a__10_
b/a__1_/a__11_
b/a__0_
b/a__0_/a__00_
b/a__0_/a__01_
$
途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。
まだ見てくれてる? 変更するんじゃなくて新たに作るほうが無難だと思うよ。
新たに作るといっても通常ファイルはハードリンクできるからね。
実際にやってみたよ。
$ find a
a
a/a (0)
a/a (0)/a (00)
a/a (0)/a (01)
a/a (1)
a/a (1)/a (11)
a/a (1)/a (10)
$ find b
b
$ cd a
$ find * -type d | perl -ne 'chop; s/[ ()]/_/g ; mkdir("../b/$_") || die("$!:$_");'
$ find * -type f | perl -ne 'chop; $old = $_; s/[ ()]/_/g ; link( $old,"../b/$_") || die("$!:$_");'
$ cd ..
$ find b
b
b/a__1_
b/a__1_/a__10_
b/a__1_/a__11_
b/a__0_
b/a__0_/a__00_
b/a__0_/a__01_
$
途中で何か起こっても起こらなくても a の方は無傷だからね。好きなだけやり直せるよ。
131デフォルトの名無しさん
2019/12/04(水) 02:51:13.25ID:hySlbdZs pax -rwlpe src dst
132デフォルトの名無しさん
2019/12/04(水) 23:27:09.69ID:xn8KyTI4 renameコマンドって複数ないか?
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
's/パターン/置換文字/' FILEとパターン 置換文字 FILEとサイトによって説明違うんだよな
俺が散らばったファイルをリネームする時はmoreutilsのvidir使ってるけど
テキストエディタで修正する奴な
133デフォルトの名無しさん
2019/12/05(木) 00:34:07.65ID:0uggokQM Larry Wall and Robin Barker版とそれの機能拡張版のAristotle Pagaltzis版じゃね
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
Aristotle Pagaltzisで増えた -s パターン 置換文字 FILE 使ってじゃないの
134デフォルトの名無しさん
2019/12/05(木) 11:01:01.81ID:3XJjcX6a >>132
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
util-linux版とperl同梱版(これはさらにいくつかに分かれる)の違い
debian/ubuntu なら前者rename.ul後者rename(Larry Wall版)
centos なら前者rename後者prename(Peder Stray版)
135デフォルトの名無しさん
2019/12/05(木) 11:02:39.94ID:6ZFP3Xq2136デフォルトの名無しさん
2019/12/05(木) 15:05:31.16ID:0uggokQM Larry Wall
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも
https://github.com/tldr-pages/tldr/issues/3125
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.
らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな
- Robin Barker, 重複時実行しない、 重複時実行強制実行オプション
-- Aristotle Pagaltzis, 機能いろいろ (>>132 のはそのうちの -s/--subst from to じゃないの)
- Peder Stray, 重複時バックアップオプション
Aristotle Pagaltzis意外はそんなに変わらんかな。Aristotle Pagaltzisで追加した機能を使わなければAristotle Pagaltzisも
https://github.com/tldr-pages/tldr/issues/3125
Debian prename from pkg perl: Robin Barker & Larry Wall.
Debian/Ubuntu file-rename from pkg file-rename: Larry Wall.
Arch perl-rename from pkg perl-rename: Peder Stray (same as Fedora).
Fedora prename from pkg prename: Peder Stray (same as Arch).
macOS rename from pkg rename: Aristotle Pagaltzis.
らしいけど、Larry Wall版ってあるのか?Ubuntu は Larry Wall and Robin Barker だな
137デフォルトの名無しさん
2019/12/05(木) 15:14:33.96ID:TzSLtKO4 たぶん基本的なことだと思うんですが、教えてください。
#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv
このスクリプトを実行すると…
$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description
このように、先頭に-eが入ってしまいます。なぜでしょう…?
#!/bin/bash
echo -e \
'Hostname\tIP\tInterface\tVlan\tMode\tPort-Channel\tAllowed\sVlan\tDescription'\
> cp.tsv
このスクリプトを実行すると…
$cat cp.tsv
-e Hostname IP Interface Vlan Mode Port-Channel Allowed Vlan Description
このように、先頭に-eが入ってしまいます。なぜでしょう…?
138デフォルトの名無しさん
2019/12/05(木) 15:19:51.21ID:0uggokQM Perl同梱(?)のprename/file-renameがLarry Wall版か
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
Ubuntuで pkg rename (pkg file-rename??)を入れるとprename/file-renameもLarry Wall and Robin Barker版に上書きされる感じかな??
139デフォルトの名無しさん
2019/12/05(木) 15:21:52.11ID:0uggokQM140デフォルトの名無しさん
2019/12/05(木) 15:22:44.42ID:WdOnkWYr141デフォルトの名無しさん
2019/12/05(木) 15:55:06.05ID:Gb1I+/8K142デフォルトの名無しさん
2019/12/05(木) 15:58:33.95ID:TzSLtKO4 >>140-141
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
あ、ほんとだ。
sh -xで実行してました。
bash -xだと大丈夫でした。
シェバン付けてるから大丈夫だと思い込んでました。ダメなんですね。
横着せずにきちんと打つようにします。
ありがとうございました!
143デフォルトの名無しさん
2019/12/06(金) 20:34:56.63ID:08yg4gJX 宇宙刑事シェバン
144デフォルトの名無しさん
2019/12/10(火) 22:30:09.16ID:zD6aLrgM x-y
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
↑こういう形式の,ハイフンで結ばれた二つの数字の計算結果の正負だけを知りたいのですが,
なるべく処理が早い方法ないですか。
対象の文字列は標準出力ではなくて変数に格納されています。
思い付いたのは
[ ${var%-*} -lt ${var#*-} ]
か
$((var < 0))
です。
どっちもPOSIXには準拠している筈ですが,同じような処理を大量に繰り返すとどうしても遅くなります。
これがシェルスクリプトの限界なら,仕方ないのですが,もう少し最適化できそうな気もします。
どうかお知恵とお力を貸してください。
145デフォルトの名無しさん
2019/12/10(火) 23:18:51.56ID:kdXCWOtW $((var < 0))はPOSIX準拠じゃなくね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
やるなら [ $(($var)) -lt 0 ] こうだろうけど
それでも遅いって言うならどうしようもないと思うが、
気になるほど遅いなら別のところに問題があるんじゃね?
146デフォルトの名無しさん
2019/12/10(火) 23:24:09.60ID:kdXCWOtW ちなみにうちのマシンだとこんな感じ
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
$ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.722s
user 0m2.718s
sys 0m0.004s
100万やって3秒、1万回だと0.03秒。これが気になるとしたら
相当多くの数の計算をしてることになるはずなんだが本当に?
147デフォルトの名無しさん
2019/12/10(火) 23:25:16.53ID:SL+fGedD echo "$var<0"|bc
148デフォルトの名無しさん
2019/12/10(火) 23:28:35.11ID:kdXCWOtW bcプロセス起動してるから遅い
それは実行しなくてもわかる
それは実行しなくてもわかる
149デフォルトの名無しさん
2019/12/10(火) 23:50:31.02ID:kdXCWOtW あとオマケ、速いとは思えないけど
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
IFS=-
var=1-2
set -- $var
echo $1 # 1
echo $2 # 2
これを使ってもできる。
速さは [ ${var%-*} -lt ${var#*-} ] とどっこいどっこいだろうな
もしかしたらset使ったほうが速いかもしれない程度
150デフォルトの名無しさん
2019/12/10(火) 23:51:59.49ID:LOypIkS3151デフォルトの名無しさん
2019/12/10(火) 23:59:28.15ID:kdXCWOtW152デフォルトの名無しさん
2019/12/11(水) 00:00:32.26ID:ivhCTlPt i7 3.4Ghzって今どき低スペックなのか?
ハイスペックかと思ってた
ハイスペックかと思ってた
153デフォルトの名無しさん
2019/12/11(水) 00:00:55.23ID:5YQOA1oq154デフォルトの名無しさん
2019/12/11(水) 00:03:27.10ID:5YQOA1oq >>152
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
スペックは低くはないと思うけどさ、もう古いし
中古だと2〜3万円台で搭載パソコンを買えちゃうよ
https://used.dospara.co.jp/sale/search.php?view=1&kw=Core%20i7%203770&page=1
155デフォルトの名無しさん
2019/12/11(水) 00:11:26.60ID:ivhCTlPt156デフォルトの名無しさん
2019/12/11(水) 00:15:38.57ID:rj8eSq0k バックグラウンドで色々動きっぱなし(usage 60%ぐらい)のWindows PC(Ryzen 5 2600, 3.66GHz)で
Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s
WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s
だった。えっ、私のCygwin遅すぎ・・・
Cygwin
real 0m23.706s
user 0m23.375s
sys 0m0.093s
WSL
real 0m3.987s
user 0m3.891s
sys 0m0.016s
だった。えっ、私のCygwin遅すぎ・・・
157デフォルトの名無しさん
2019/12/11(水) 00:21:29.42ID:5YQOA1oq158デフォルトの名無しさん
2019/12/11(水) 00:26:41.57ID:H3x5MOt+ >>153
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる
計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる
$ printf "%d-%d¥n" $(shuf -r -i 0-999 -n 1000000) $(shuf -r -i 0-999 -n 1000000) > input.txt
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
1行目は0-999でランダムな引き算を100万件生成してファイル出力
2行目の処理は50秒かかったのと同じマシンで1.7~1.8秒で終わる
計算結果をキャッシュするからか10種類くらいの引き算の使い回しだと
100万件でも0.17秒くらいになる
159デフォルトの名無しさん
2019/12/11(水) 00:40:07.88ID:5YQOA1oq >>158
円文字化けしてんぞ
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
real 0m0.373s
user 0m0.300s
sys 0m0.005s
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt
real 0m8.247s
user 0m4.337s
sys 0m3.904s
まあ速いんだろうけどさ。想定の範囲内かな。
円文字化けしてんぞ
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+"$0 : " "$0 }' < input.txt > output.txt
real 0m0.373s
user 0m0.300s
sys 0m0.005s
$ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo "+$var" || echo " $var"; done' < input.txt > output2.txt
real 0m8.247s
user 0m4.337s
sys 0m3.904s
まあ速いんだろうけどさ。想定の範囲内かな。
160デフォルトの名無しさん
2019/12/11(水) 00:40:26.36ID:H3x5MOt+ ランダムな引き算生成するawkバージョン
$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
$ awk 'BEGIN{srand(); for (i=0; i<1000000; ++i) {print int(rand()*1000)"-"int(rand()*1000)}}' > input.txt
161デフォルトの名無しさん
2019/12/11(水) 00:46:42.05ID:5YQOA1oq お、こっちの方がわずかに速かった。スクリプトで計算させるよりも読み込み時に分割させたほうが良いんだろうな。
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど
$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt
real 0m7.866s
user 0m4.114s
sys 0m3.744s
setを使って分割した場合は、setの呼び出しでコストがかかると思うけど
$ time sh -c 'IFS=-; while read i j; do [ $i -gt $j ] && echo "+$i-$j" || echo " $i-$j" ; done' < input.txt > output2.txt
real 0m7.866s
user 0m4.114s
sys 0m3.744s
162デフォルトの名無しさん
2019/12/11(水) 00:53:02.45ID:mRJcWm57 $ time sh -c 'var=1-2; i=0; while [ $i -lt 1000000 ]; do [ $(($var)) -lt 0 ]; i=$((i+1)); done'
real 0m2.268s
user 0m2.264s
sys 0m0.004s
$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s
real 0m2.268s
user 0m2.264s
sys 0m0.004s
$ time { var=1-2; echo "i=0;while(i<=1000000){${var}<=0;i++;}" | bc > /dev/null; }
real 0m1.540s
user 0m1.175s
sys 0m0.366s
163デフォルトの名無しさん
2019/12/11(水) 00:54:49.86ID:5YQOA1oq > 対象の文字列は標準出力ではなくて変数に格納されています。
お前らこの条件忘れてるだろw
お前らこの条件忘れてるだろw
164デフォルトの名無しさん
2019/12/11(水) 01:39:58.92ID:5YQOA1oq うーん、よく考えるとこれ実際の要件を想定して
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん
$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.678s
user 0m9.059s
sys 0m4.427s
$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.629s
user 0m6.358s
sys 0m1.580s
$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.649s
user 0m6.869s
sys 0m2.006s
「それぞれのコマンドを使って処理をした結果を元に続きの処理をする」となると
差があまりなくなってしまうかもしれん
$ time sh -c 'while read var; do echo $(($var)); done' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.678s
user 0m9.059s
sys 0m4.427s
$ time awk -F "-" '{ print $1-$2 }' < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.629s
user 0m6.358s
sys 0m1.580s
$ time bc < input.txt | while read i; do [ $i -lt 0 ]; done
real 0m7.649s
user 0m6.869s
sys 0m2.006s
165デフォルトの名無しさん
2019/12/11(水) 01:44:25.40ID:5YQOA1oq $ time sh -c 'while read var; do [ $(($var)) -gt 0 ] && echo + || echo; done' < input.txt | while read i; do [ "$i" ]; done
real 0m7.596s
user 0m9.484s
sys 0m5.123s
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done
real 0m5.418s
user 0m4.670s
sys 0m1.012s
real 0m7.596s
user 0m9.484s
sys 0m5.123s
$ time awk -F "-" '{ print (($1-$2) > 0) ? "+" : "" }' < input.txt | while read i; do [ "$i" ]; done
real 0m5.418s
user 0m4.670s
sys 0m1.012s
166デフォルトの名無しさん
2019/12/11(水) 01:47:25.15ID:5YQOA1oq 結果をファイルに吐き出すだけなら良いんだけどね、
その結果をシェルスクリプトを使って処理する場合の話
その結果をシェルスクリプトを使って処理する場合の話
167デフォルトの名無しさん
2019/12/11(水) 03:39:07.57ID:MgOCMEvC >>151
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする
シェルスクリプトなんかスレッド使わないだろうし
今年出た i5 9500
プロセッサー・ベース動作周波数 3.00 GHz
ターボ・ブースト利用時の最大周波数 4.40 GHz
あんまり変わらない気がする
シェルスクリプトなんかスレッド使わないだろうし
168デフォルトの名無しさん
2019/12/11(水) 07:28:04.35ID:hRzITiR9169デフォルトの名無しさん
2019/12/11(水) 08:22:26.35ID:6UY8oXji >>145
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
によると
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01
の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい
とあるから>はPOSIXの範疇だと思います。
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04
によると
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01
の一覧の内,sizeof()函数,++及び--単項演算子,Selection・Interation・Jumpは実装しなくてよい
とあるから>はPOSIXの範疇だと思います。
170デフォルトの名無しさん
2019/12/11(水) 12:44:26.62ID:MgOCMEvC >>168
そりゃプロセスだろ
そりゃプロセスだろ
171デフォルトの名無しさん
2019/12/11(水) 13:32:50.85ID:hRzITiR9 >>170
今はCPUの話だからハイパースレッディングのスレッドだろう
今はCPUの話だからハイパースレッディングのスレッドだろう
172デフォルトの名無しさん
2019/12/11(水) 13:55:32.35ID:hRzITiR9173デフォルトの名無しさん
2019/12/11(水) 15:18:53.13ID:++mq81bA174デフォルトの名無しさん
2019/12/11(水) 15:22:46.18ID:++mq81bA プロセスが別のコアで動くとかか??
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
スレッドをハイパースレッディングのスレッドを指すなんて初めてみた
175デフォルトの名無しさん
2019/12/11(水) 15:28:13.91ID:hRzITiR9176デフォルトの名無しさん
2019/12/11(水) 15:29:58.09ID:hRzITiR9 >>174
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&pdf_Spec306=4
普通にCPUの所に4コア8スレッドって書いてあるからさ
https://kakaku.com/pc/cpu/itemlist.aspx?pdf_se=22&pdf_Spec306=4
177デフォルトの名無しさん
2019/12/11(水) 15:39:31.82ID:++mq81bA そこまで出されるとマジでスレッドという意味で使ってたんだな
OSも知らないスレッドだろう、OSから見てもただのコアだろう
OSも知らないスレッドだろう、OSから見てもただのコアだろう
178デフォルトの名無しさん
2019/12/11(水) 15:46:36.17ID:hRzITiR9179デフォルトの名無しさん
2019/12/11(水) 15:55:15.40ID:++mq81bA 一行目なんて書かなきゃならないのね
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw
プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
>>167もそんなスレッドのことを言ってないだろうに。なんでかなw
プロセスじゃなくスレッドならプロセス起動する無駄時間がないとかそういう意味でのだろうし、そもそもスレッドはそういうために
元々のネタがプロセス起動にどれだけ食われてるのかという話だな、するなら
180デフォルトの名無しさん
2019/12/11(水) 16:11:12.77ID:6UY8oXji >>172
なるほど。確かに準拠してませんでした,すいません。
なるほど。確かに準拠してませんでした,すいません。
181デフォルトの名無しさん
2019/12/11(水) 20:23:56.94ID:MgOCMEvC182デフォルトの名無しさん
2019/12/12(木) 01:47:04.79ID:4Chv4WTd183デフォルトの名無しさん
2019/12/12(木) 02:33:13.07ID:NtLqNRlV184デフォルトの名無しさん
2019/12/12(木) 02:40:24.09ID:n05Ewb3K CPUのスペック比較とシェルスクリプトでスレッド使わないという話とどう関係あるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
新しいCPUはOSスレッドを効率的に実行できる機能でもあるの?
185デフォルトの名無しさん
2019/12/12(木) 03:38:37.48ID:g+q4RhTJ そうだよな。CPUの話をしていたのに
なんでスレッド使うかどうかの話をしたのかだよな
> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
なんでスレッド使うかどうかの話をしたのかだよな
> 今年出た i5 9500
> プロセッサー・ベース動作周波数 3.00 GHz
> ターボ・ブースト利用時の最大周波数 4.40 GHz
> あんまり変わらない気がする
>
> シェルスクリプトなんかスレッド使わないだろうし
186デフォルトの名無しさん
2019/12/12(木) 03:41:30.87ID:g+q4RhTJ スレッド使わなくてもコア使うから関係あるだろって言えばよかったのか?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
i5 9500の名前を出したのは、コア6スレッド6だからだろ?
187デフォルトの名無しさん
2019/12/12(木) 08:10:01.85ID:NtLqNRlV >>184
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話
新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
最新のCPUにしたところで周波数がちょっと早くなった程度で差が無いって話
新しいCPUは同時実行スレッド数が増えてるとか言う奴がいるけどシェルスクリプトには関係ないだろ?
「どう関係あるの? 」とか言われても「関係ない」って最初から書いてんのに読めない訳?
188デフォルトの名無しさん
2019/12/12(木) 08:11:55.05ID:NtLqNRlV189デフォルトの名無しさん
2019/12/12(木) 09:49:29.49ID:AVYkL4QT 本気でシェルスクリプトとコアが関係ないと思ってるのか?
パイプ使ったら複数コア使うことになるんだが
例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く
あとバックグラウンド実行もあるよね
自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
パイプ使ったら複数コア使うことになるんだが
例えばcat ファイル名 | grep なんとか ってやると
catのファイル表示と、grepが並列で動く
あとバックグラウンド実行もあるよね
自分が並列で動くものを書いてないからって、
シェルスクリプトと並列が関係ないわけじゃないだろ
自分が書かないって話をするならC言語だってコアは関係ない
190デフォルトの名無しさん
2019/12/12(木) 09:52:07.59ID:AVYkL4QT あと、xargsとかGNU parallelとか
191デフォルトの名無しさん
2019/12/12(木) 10:19:43.03ID:mtFqZIGW それはプロセスレベルの並列化のお話。スレッドの話はどこいった?
192デフォルトの名無しさん
2019/12/12(木) 10:24:13.74ID:AVYkL4QT シェルスクリプトで外部コマンドを使わない場合の話でもしてるのか?
シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ
それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
省略
done < ファイル名
外部コマンド一切なし
シェルスクリプトでパイプを使わないならコアは関係ない!
そんな事ありえないけど関係ないんだ!
みたいな話したってしょうがないだろ
それにパイプ使うのは foo | bar | baz みたいなシェル関数でも使えるし
シェル関数の中身はそれぞれこんな感じな
while read line
do
省略
done < ファイル名
外部コマンド一切なし
193デフォルトの名無しさん
2019/12/12(木) 10:24:48.46ID:AVYkL4QT >>191
今はCPUコアの話
今はCPUコアの話
194デフォルトの名無しさん
2019/12/12(木) 12:23:33.66ID:NxSFhA/k >コア6スレッド6だからだろ
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
それを言うならスレッド12だろ。ハイパースレッディングでスペック表すときの論理コア数をスレッドと言っているにすぎないだろうに
いつものやつが絡んでるだけだろうな、すぐに話を逸らすことからも
195デフォルトの名無しさん
2019/12/12(木) 12:43:03.31ID:NxSFhA/k196デフォルトの名無しさん
2019/12/12(木) 12:57:42.86ID:NxSFhA/k >>195,183
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
>まあ、シェル自体はスレッドを使ってることもあるだろう、いまどき
いや、いまどきも1シェルプロセスは1スレッドしかなのか。仮にスレッド使う場合があったとしてもどういう場合というのはわからんな
確認せずにいまどきならと書いた、すまん
197デフォルトの名無しさん
2019/12/12(木) 16:08:19.94ID:AVYkL4QT198デフォルトの名無しさん
2019/12/12(木) 16:10:23.64ID:AVYkL4QT199デフォルトの名無しさん
2019/12/12(木) 16:11:47.38ID:AVYkL4QT200デフォルトの名無しさん
2019/12/12(木) 16:24:20.77ID:AVYkL4QT ちなみに>>164-165とかはパイプを使ってるのでコア数は意味がある
例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'
例えばこれだとshプロセスが2つ起動して、それぞれCPUコアを使っている
time sh -c 'while read var; do echo $(($var)); done < input.txt | while read i; do [ $i -lt 0 ]; done'
201デフォルトの名無しさん
2019/12/12(木) 16:41:19.05ID:1H8k0UmA 自己文書化(?)されたシェルスクリプトの例
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
http://www.tip.net.au/wiki/index.php/Self_documenting_bash_script_options
もうちょっと洗練して、例えばhelp関数から実行するときはgettoptsコマンドを
ヘルプ出力用に書換えたものにするなんてこともできそう。
202デフォルトの名無しさん
2019/12/12(木) 16:43:22.79ID:AVYkL4QT203デフォルトの名無しさん
2019/12/12(木) 16:49:53.62ID:mtFqZIGW $ seq 1 inf | tail
を実行して別のターミナルで
$ top -1
を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
を実行して別のターミナルで
$ top -1
を実行してみる。f キーを押して fields management 画面に進んで
"Last Used Cpu" を選んで表示させる様にするとプロセスがどの
CPUコアで実行されているか表示される
204デフォルトの名無しさん
2019/12/12(木) 17:08:05.32ID:1H8k0UmA205デフォルトの名無しさん
2019/12/12(木) 17:46:32.53ID:3GyD1b3F206デフォルトの名無しさん
2019/12/12(木) 17:46:52.23ID:AVYkL4QT >>204
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、
とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
ああ、ヘルプの自動生成か。悩むところだよね。
簡単なのなら確かにそのリンク先みたいにできるだろうけど
時々例外的なコードはいるしさ、
とういうかリンク先、なんであんなよくわからんコードなんだ?
もっと簡潔にかけそうなんだが
txmp.txt? zenity?ん??GUI表示するため?
207デフォルトの名無しさん
2019/12/12(木) 17:48:26.91ID:AVYkL4QT208デフォルトの名無しさん
2019/12/12(木) 17:53:26.87ID:AVYkL4QT 試しに書いてみようかと思ってコピペしようとしたら画像やしw
209デフォルトの名無しさん
2019/12/12(木) 18:02:50.61ID:CkUjiG2X >>207
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
今回のハイパースレッディングでのスレッドを言い出し絡みまくりからは、ないな
210デフォルトの名無しさん
2019/12/12(木) 18:16:03.44ID:n05Ewb3K211デフォルトの名無しさん
2019/12/12(木) 18:21:26.57ID:CkUjiG2X >>210
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?
「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
ん?オプティマイズが仮にあったとしても並列はしないだろう、あの文では
並列にになるように書いた「別の」スクリプトとは別の話だけど?
「え?」じゃなくどうスレッドの効果があるように思うの?みんなはスッキリするかもwだが俺はもやもやもやもやするぞw
212デフォルトの名無しさん
2019/12/12(木) 18:22:28.30ID:AVYkL4QT >>201
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw
#!/bin/sh
print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}
while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done
やっつけ仕事w もっと正規表現頑張れば短くできそうだけど、やる気なしw
#!/bin/sh
print_opts() {
sed -nE '/\s+###START/,/\s+###END/ p' < "$1" | while read line; do
case $line in
"###"*) ;;
[0-9a-zA-Z]*)
echo -n "-${line%%)*}"
case $line in *"#"*) echo -n "${line#*#}"; esac
echo
;;
"#"*) echo " ${line#*#}" ;;
esac
done
}
while getopts "h456" optionName; do
case $optionName in
###START
h) print_opts "$0" ;;
4) ;; # negate
5) ;; # colorspace COLOR
# COLOR: RED ro GREEN or BLUE
6) ;; # sepia-tone
###END
esac
done
213デフォルトの名無しさん
2019/12/12(木) 18:26:08.31ID:AVYkL4QT >>211
今シェルスクリプトの話をしてるんですよ?
という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし
例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw
最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
今シェルスクリプトの話をしてるんですよ?
という言い方をしておいて、特定のシェルスクリプトコードの話になるわけないし
例えばC言語で使うのは1コアだけだろうがと言われても「は?」としか思わん。
言ったあとで「特定のC言語のコードのことだよ」って弁解してもねw
最初からシェルスクリプトで並列処理できないと思ってたのバレバレだから
214デフォルトの名無しさん
2019/12/12(木) 18:33:38.18ID:CkUjiG2X215デフォルトの名無しさん
2019/12/12(木) 18:38:11.60ID:CkUjiG2X■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「脅迫だ」国分太一に同情論 音声データ削除要求など日テレの対応を疑問視する声ネットに噴出「それこそコンプラ違反では」★2 [muffin★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… ★2 [BFU★]
- 【工作員】「X」のアカウント所在地公開機能が暴いた世論操作の実態 MAGA支持著名アカウントの多くが米国外から運営 日本にも波及 ★3 [ごまカンパチ★]
- 生クリームだけの真っ白なクリスマスケーキ 大手メーカーが販売、その理由は…フルーツなしで価格は半額以下に ★3 [おっさん友の会★]
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★5 [Ailuropoda melanoleuca★]
- 【芸能】日本のファンも悲鳴、香港トップスターが来日コンサートを突如中止 「早く政府間で解決を」運営会社の切実な訴え [冬月記者★]
- 中国外務省「全く不十分だ。ごまかすような手口を使うべきではない」高市答弁を批判 [834922174]
- まったりまったりおじゃる丸待機スレ🏡
- 【急募】性欲抜きのまんこの魅力 [904880432]
- 高市応援団「都合よく解釈するな」「撤回すると言ってない」「中国と断交」「撤回する必要ない」「答弁変わってない」「武力行使しろ」 [931948549]
- ヤンジャン新人漫画大賞、入賞作品のAI絵疑惑で大荒れ😄😄😄 高市早苗要素あり [175344491]
- 合法の範囲でできることをやり尽くした人間は犯罪行為に興味を持ちがち
